问题:我需要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
)。
答案 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}}。