【发布时间】:2017-05-28 03:57:40
【问题描述】:
我目前正在玩模板元编程。我正在尝试使用 tmp 制作一个有限状态机。我知道网络上有几种实现,但我想自己实现一个作为练习。
我有一个名为Condition 的类,它是两个状态之间转换条件的基类。一种实现是AnyCondition 类:
template<class Input, Input comp, Input ... comps >
class AnyCondition: public Condition<Input>
{
public:
AnyCondition() {}
bool operator()(const Input& input) const override
{
return input == comp || AnyCondition<Input, comps...>()(input);
}
};
这里的问题是,编译器将递归地扩展它,由于input 参数,这会在运行时导致大量递归调用。如果扩展代码是这样的语句,它应该更有效:
bool operator()(const Input& input) const override
{
return input == comp1 || input == comp2 || input == comp3...
}
这有可能吗?
【问题讨论】:
-
您可以使用 va_list 循环遍历它们并检查每个 comp 值吗?
-
我现在无法测试,但你确定编译器在优化编译时仍然使用递归调用吗?
-
我不认为编译器会递归地扩展它,但它会在编译时将它扩展成你想要的代码。你测试过吗?
-
@Abhinav
va_list不是模板元编程。 OP 正在寻找具有类型安全性的编译时解决方案。 -
啊,好的,谢谢!保罗
标签: c++ c++11 templates variadic-templates template-meta-programming