2017-11-21 14 views
3

벡터의 벡터를 만들고 싶습니다. 이 질문은 이미 많은 시간에 게시되었지만 만족스러운 답변을 찾지 못했습니다.다른 종류의 벡터 벡터

  • 각 벡터는 다른 종류의
  • 을 가질 수 있습니다 나는 컴파일 타임에 유형을 모르는 내가이 포함됩니다 얼마나 많은 벡터 모르는

기본적으로 : 그 때문에 나는 의사 코드에 그런 일을 할 수 있도록하고 싶습니다 나중에

types = ["char", "int", "double", "int"] 
container<vector> x 

foreach (type in types) 
{ 
    if (type == "char") 
    x.push_back(vector<char>) 
    else if (type == "int") 
    x.push_back(vector<int>) 
    else 
    x.push_back(vector<double>) 
} 

및 나는 내가 boost::any 내게 도움이 될 수 있습니다 생각하지만 난 아직 부스트에 익숙하지 않다 예를

x[0].push_back("a") 
x[1].push_back(1) 
x[2].push_back(3.1416) 

을 위해 할 수 있도록하고 싶습니다.

요점은 이상하게 들리더라도 실제로하고 싶은 점입니다. 저는 구조체의 벡터가 필요 없으며 다른 유형의 std::vector을 포함하는 컨테이너를 원합니다. 이유는 바이너리 파일을 읽고 있기 때문입니다. 파일의 헤더는 데이터의 수와 유형을 나타내지 만 파일에서 다른 것으로 변경할 수 있습니다. 따라서 컴파일 시간에는 알 수 없습니다.

+4

** 정적으로 입력 된 ** 언어는'i'가 컴파일 타임 상수 표현이 아닐 때'x [i] .push_back (...); '을 어떻게 해결해야합니까? – StoryTeller

+2

'boost/std :: variant'를 사용하십시오. – geza

+2

@geza : OP가 컴파일 타임에 유형을 모르는 경우 변형이 도움이되지 않습니다. ''any '가 더 좋을 지 모르지만, 이것은 디자인 결함의 냄새가 난다. – AndyG

답변

8

아마도 변형 벡터를 사용할 수 있습니까?

using ints = std::vector<int>; 
using chars = std::vector<char>; 
using doubles = std::vector<double>; 
using mixed_data_t = std::vector<std::variant<chars, ints, doubles>>; 

각 파일의 데이터 유형이 동일한 경우 런타임에 해당 파일을 찾아 해당 변형 벡터로 다시 푸시 할 수 있습니다. 파일 데이터를 혼합 한 경우

당신은

std::vector<std::vector<std::variant<char, int, double>>>; 

를 사용할 수 있지만, 각 삽입을 확인해야합니다.

boost::any은 삽입 할 때마다 형식 정보가 손실되므로 상당히 찾고 있다고 확신합니다.

+1

요점은 파일이 표준화되어 있지만 무료 인 추가 데이터를 가질 수 있다는 것입니다. 헤더에 포함 된 내용이 명확하게 나와 있지만 컴파일 시간에는 잘 모릅니다. 한 번만 헤더를 읽었습니다. – JRR

+0

@JRR 변형의 유형은 런타임에 결정됩니다. 런타임 유형은 템플릿 매개 변수로 전송 된 유형에 따라 달라질 수 있습니다. –

+0

'C++ 17 '을 지원하는지 확인하십시오. – PhotometricStereo