gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:27 41 4
gpt4 key购买 nike

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

最佳答案

如果我正确理解你的问题,你可以只提供调用运算符的两个重载,一个接受 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 在命令行中。

关于c++ - 模板递归区分 boot::tuple 中的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16736099/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com