当前位置:  开发笔记 > 编程语言 > 正文

C ++将可变参数模板参数扩展为语句

如何解决《C++将可变参数模板参数扩展为语句》经验,为你挑选了1个好方法。

我目前正在玩模板元编程。我正在尝试通过使用tmp来制作有限状态机。我知道网络上有几种实现方式,但是我想自己做一个练习。

我有一个称为的类Condition,它是两个状态之间转换的条件的基类。AnyCondition该类是一种实现:

template
class 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...
    }

这有可能吗?



1> Vittorio Rom..:

C ++ 17解决方案- 折叠表达式

template 
auto anyCondition(Ts... xs)
{
    return (xs || ...);
}

魔盒示例


C ++ 11解决方案- for_each_argument

template 
void 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解释并扩展了”

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有