2013-05-23 1 views
4

C++에서 여러 유형의 벡터를 만들 수 있습니까? 많은 다른 유형을 포함하는 벡터를 빌드하고 반복 할 수 있기를 바랍니다. 예 :C++ 일반 벡터

vector<generic> myVec; 
myVec.push_back(myInt); 
myVec.push_back(myString); 
etc... 

벡터가 다른 데이터 유형을 보유 할 수 있어야합니다. C++ 라이브러리에서 사용해야하는 다른 벡터와 비슷한 유형이 있습니까?

모든 방향에 만족합니다.

+2

아마도'boost :: variant'의 벡터입니다. – chris

+2

또 다른 선택은'boost :: any' – dchhetri

+0

이 아니라'std :: vector'가 아니라'std :: tuple' (C++ 11에서)입니다. std :: vector는 uniform 타입의 컨테이너입니다. –

답변

7

boost::any을 사용할 수 있습니다. 예를 들면 : 당신이 어떤 정의 된 범위에 허용 된 유형의 집합을 제한하려면

#include <vector> 
#include <boost/any.hpp> 
#include <iostream> 

struct my_class { my_class(int i) : x{i} { } int x; }; 

int main() 
{ 
    std::vector<boost::any> v; 

    v.push_back(42); 
    v.push_back(std::string{"Hello!"}); 
    v.push_back(my_class{1729}); 

    my_class obj = boost::any_cast<my_class>(v[2]); 
    std::cout << obj.x; 
} 

, 당신은 boost::variant 대신 사용할 수 있습니다 또한 방문 지원

#include <vector> 
#include <boost/variant.hpp> 
#include <iostream> 

struct my_class { my_class(int i) : x{i} { } int x; }; 

int main() 
{ 
    typedef boost::variant<int, std::string, my_class> my_variant; 
    std::vector<my_variant> v; 

    v.push_back(42); 
    v.push_back("Hello!"); 
    v.push_back(my_class{1729}); 

    my_class obj = boost::get<my_class>(v[2]); 
    std::cout << obj.x; 
} 

boost::variant. 아래의 수행으로

struct my_visitor : boost::static_visitor<void> 
{ 
    void operator() (int i) 
    { 
     std::cout << "Look, I got an int! " << i << std::endl; 
    } 

    void operator() (std::string const& s) 
    { 
     std::cout << "Look, I got an string! " << s << std::endl; 
    } 

    void operator() (my_class const& obj) 
    { 
     std::cout << "Look, I got a UDT! And inside it a " << obj.x << std::endl; 
    } 
}; 

그리고 그것을 호출 : 당신은 변형에 가능한 모든 유형을 처리 할 수있는 방문자를 정의 할 수

다음
int main() 
{ 
    typedef boost::variant<int, std::string, my_class> my_variant; 
    std::vector<my_variant> v; 

    v.push_back(42); 
    v.push_back("Hello!"); 
    v.push_back(my_class{1729}); 

    my_visitor mv; 
    for (auto const& e : v) 
    { 
     e.apply_visitor(mv); 
    } 
} 

live example이다. boost::variant에 대한 좋은 점은 방문자가 변형이 보유 할 수있는 모든 유형을 처리 할 수 ​​있는지 컴파일 타임 검사를 수행한다는 것입니다.

+0

대단히 감사합니다! –

+0

@ChristopherBales : 기꺼이 도와 드리겠습니다. :) –

+0

불행히도'boost :: any'는 불행히도 any_cast가 아니라면 값을 얻는 좋은 방법이 아닌 것 같습니다. –