模板递归区分boot :: tuple中的数据类型

时间:2013-05-24 13:25:35

标签: c++ templates boost boost-fusion

问题:我需要A的函数对象来递归boost :: tuple的数据类型,但对传入成员t的所有其他数据类型执行其他操作。

class A{
public:
    template<typename T>
    void operator()(T& t) const{
//      if (t == tuple){
//          recurse
//      } else{
//          doSomething
//      }
    }
};

class B{
    void init(){
        boost::tuple<int, float> a;
        boost::tuple< boost::tuple<int, std::string>, float > b;

        boost::fusion::for_each(a, A());
        boost::fusion::for_each(b, A());
    }
};

我尝试的是为A的声明之上的所有可能的传入数据类型设置静态函数,但是我无法返回到递归函数,因为这些静态不知道{{1} }。 我的第二种方法是为所有可能的数据类型实现静态函数,为boost :: tuple返回class A,为其他任何数据类型返回true(非常类似于示例)。但是,由于我无法实现false调用,因为(即使它被if情况包装)我的IDE说没有匹配的函数调用(对于for_each的类型都是如此,{ {1}}和int)。

1 个答案:

答案 0 :(得分:2)

如果我正确地理解了你的问题,你可以提供两个调用运算符的重载,一个接受boost::tuple的实例化并在该元组上调用boost::fusion::for_each(),另一个可以接受的回退任何类型的论证,并对“叶子”类型执行具体操作:

class A
{
public:
    template<typename T>
    void operator()(T& t) const
    {
        // Do something
    }

    template<typename... Ts>
    void operator ()(boost::tuple<Ts...>& t) const
    {
        // Recurse
        boost::fusion::for_each(t, A());
    }
};

在上面的示例中,我使用的是C ++ 11的可变参数模板,因此您需要一个符合C ++ 11标准的编译器才能工作(并且不要忘记指定标志-std=c++11或{命令行中的{1}}。