在 c++11 中迭代函子元组
Iterate over tuple of functors in c++11
我有一个函子(未知的arity(std::tuple
,它们应该都返回相同的类型,所以像这样:
typedef functor std::function<bool()>;
std::tuple<functor, functor, functor...> functors;
我想迭代函子,评估每个成员,直到找到一个成功的成员,否则失败。 如何在 c++11 中实现这一点?
不是特别有创意,但...
如果按如下方式创建foo()
函数
template <typename ... Args>
bool foo (std::tuple<Args...> const & tf)
{ return bar<0>(tf); }
该调用,从模板索引 0 开始,以下几个模板(启用/禁用 SFINAE(替代函数
template <std::size_t I, typename ... Args>
typename std::enable_if<(I >= sizeof...(Args)), bool>::type
bar (std::tuple<Args...> const &)
{ return false; }
template <std::size_t I, typename ... Args>
typename std::enable_if<(I < sizeof...(Args)), bool>::type
bar (std::tuple<Args...> const & tf)
{ return baz(std::get<I>(tf)) || bar<I+1U>(tf); }
以及一个额外的baz()
函数来调用单个函子
bool baz (functor const & f)
{ return f(); }
我想你可以得到你想要的。
以下是完整的工作示例
#include <tuple>
#include <iostream>
#include <functional>
using functor = std::function<bool()>;
bool baz (functor const & f)
{ return f(); }
template <std::size_t I, typename ... Args>
typename std::enable_if<(I >= sizeof...(Args)), bool>::type
bar (std::tuple<Args...> const &)
{ return false; }
template <std::size_t I, typename ... Args>
typename std::enable_if<(I < sizeof...(Args)), bool>::type
bar (std::tuple<Args...> const & tf)
{ return baz(std::get<I>(tf)) || bar<I+1U>(tf); }
template <typename ... Args>
bool foo (std::tuple<Args...> const & tf)
{ return bar<0>(tf); }
bool f0 () { std::cout << "f0 "; return false; }
bool f1 () { std::cout << "f1 "; return false; }
bool f2 () { std::cout << "f2 "; return false; }
bool f3 () { std::cout << "f3 "; return false; }
bool f4 () { std::cout << "f4 "; return true; }
bool f5 () { std::cout << "f5 "; return false; }
bool f6 () { std::cout << "f6 "; return false; }
bool f7 () { std::cout << "f7 "; return false; }
bool f8 () { std::cout << "f8 "; return false; }
bool f9 () { std::cout << "f9 "; return false; }
int main ()
{
auto tf = std::make_tuple(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
foo(tf);
}
显然,您可以避免使用baz()
,只需按如下方式调用函子
return std::get<I>(tf)() || bar<I+1U>(tf);
但是您丢失了对Args...
类型的检查。
只需使用适当的容器 -std::vector
而不是std::tuple
:
using functor = std::function<bool()>;
using functors = std::vector<functor>;
我认为如何迭代std::vector
是很明显
相关文章:
- 在C++中使用 for 循环的数组迭代
- 在 c++11 中迭代函子元组
- 用std :: apply迭代元组元素
- 在 C++17/20 中迭代元组
- 数组迭代器不是可取消引用的错误
- 正在对元组进行迭代..再一次
- 在元组中迭代和调用异构函数
- 元素级多维数组迭代,与存储顺序无关
- 多维数组迭代效率
- 从向量的 std::元组中迭代选定的向量
- std::不带模板的数组迭代器范围
- 我可以用openmp迭代C++11 std::元组吗
- 如何对元组进行迭代
- 在多线程代码中缓存友好的数组迭代模式
- 用1个循环解释二维数组迭代
- 可变模板形参和元组迭代
- 为不使用元组的自定义映射模拟std::map迭代器
- 数组迭代器中的hasNext()方法
- 兼容STL的两个数组迭代器
- 对于循环数组迭代,if循环测试索引是否为真/假,计算结果不正确