2

问题:我需要一个函数对象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但我无法返回递归函数,因为这些静态不知道class A. true我的第二种方法是为 boost::tuple 和任何其他返回的所有可能的数据类型实现静态函数false(与示例中的非常相似)。但是我无法实现for_each调用,因为(即使它被 if 案例包装)我的 IDE 说没有匹配的函数调用(对于int,float和的类型是正确的string)。

4

1 回答 1

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-std=c++0x在命令行中)。

于 2013-05-24T13:30:12.670 回答