2013-03-05 54 views
1

我怎樣才能得到以下編譯:Predeclaring一個typedef操作的boost ::變種

typedef std::pair<std::string, Container> Structure; 

typedef boost::variant<std::vector<int>, std::vector<std::string>, std::vector<Structure> > Container; 
+1

並鏈接到上述編譯器錯誤是...? – Angew 2013-03-05 09:01:29

+0

@Angew'容器':未聲明的標識符 – Baz 2013-03-05 09:03:19

+0

似乎有一些與'recursive_wrapper'雜耍被調用,但我沒有'boost :: variant'的經驗,所以我不能建議代碼。 – Angew 2013-03-05 09:05:31

回答

3

這裏是Angew的解決方案,通過liveworkspace.org/code/3BDk6v$0

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


typedef boost::make_recursive_variant< 
     std::vector<int>, 
     std::vector<std::string>, 
     std::vector< std::pair<std::string, boost::recursive_variant_> > 
     >::type Container; 

typedef std::pair<std::string, Container> Structure; 

struct printer: boost::static_visitor<> 
{ 
    void operator()(const std::vector<int>& vec) const 
    { 
     for(const auto elem : vec) 
     std::cout << elem << std::endl; 
    } 
    void operator()(const std::vector<std::string>& vec) const 
    { 
     for(const auto& elem : vec) 
     std::cout << elem << std::endl; 
    } 
    void operator()(const std::vector<Structure>& vec) const 
    { 
     for(const auto& elem : vec) 
     { 
     std::cout << "First:" << std::endl; 
     std::cout << elem.first << std::endl; 
     std::cout << "Second:" << std::endl; 
     boost::apply_visitor(*this,elem.second); 
     } 
    } 
}; 


int main() 
{ 
    std::vector<Container> c_vec; 
    std::vector<int> int_vec; 
    int_vec.push_back(1); 
    int_vec.push_back(2); 
    Container c(int_vec); 
    Structure s=std::make_pair(std::string("name"),c); 
    std::vector<Structure> s_vec; 
    s_vec.push_back(s); 
    c_vec.push_back(int_vec); 
    c_vec.push_back(s_vec); 

    for(auto const& elem : c_vec) 
     boost::apply_visitor(printer(),elem); 
    return 0; 
} 
+0

[另一種替代方法](http://liveworkspace.org/code/2EXELu$0)使用'boost :: recursive_wrapper'並用簡單的結構改變std :: pair。 – 2013-03-05 11:59:38