问题:我需要一个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
。我的第二种方法是为所有可能的数据类型实现静态函数,为boost::tuple返回true
,为任何其他类型返回false
(与示例中非常相似)。但是我不能实现for_each
调用,因为(即使它被if包住了)我的集成开发环境说没有匹配的函数调用(对于int
、float
和string
类型是正确的)。
发布于 2013-05-24 13:30:13
如果我没理解错你的问题,你可以只提供两个调用操作符的重载,一个接受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
)。
https://stackoverflow.com/questions/16736099
复制