我目前正在玩模板元编程。我正在尝试通过使用tmp来制作有限状态机。我知道网络上有几种实现方式,但是我想自己做一个练习。
我有一个称为的类Condition
,它是两个状态之间转换的条件的基类。AnyCondition
该类是一种实现:
templateclass AnyCondition: public Condition { public: AnyCondition() {} bool operator()(const Input& input) const override { return input == comp || AnyCondition()(input); } };
此处的问题是,编译器将递归扩展此操作,由于该input
参数,在运行时将导致大量递归调用。如果扩展后的代码如下所示,则应该更有效:
bool operator()(const Input& input) const override { return input == comp1 || input == comp2 || input == comp3... }
这有可能吗?
C ++ 17解决方案- 折叠表达式:
templateauto anyCondition(Ts... xs) { return (xs || ...); }
魔盒示例
C ++ 11解决方案- for_each_argument
:
templatevoid for_each_argument(TF&& f, Ts&&... xs) { (void)(int[]){(f(std::forward (xs)), 0)...}; } template auto anyCondition(Ts... xs) { bool acc = false; for_each_argument([&acc](bool x){ acc = acc || x; }, xs...); return acc; }
魔盒示例
我在CppCon 2015上发表了关于此片段的演讲:
CppCon 2015:Vittorio Romeo“ for_each_argument
解释并扩展了”