C ++ 11使用可变参数模板参数创建编译时布尔表达式

时间:2016-11-10 11:47:26

标签: c++ c++11 variadic-templates

假设我有以下基础结构

struct Functor
{
    virtual bool execute()=0;
};

我在哪个基础上创建了结构A,B和C. 现在我想评估这些对象的可变参数列表上的布尔表达式,我将在运行时这样做:

bool evaluate(list<Functor> objs)
{
    for(list<Functor>::iterator it = objs.begin(); it!=objs.end();++it)
    {
        if(!it->execute())
            return false;
    }
    return true;
}

我的问题是我可以通过声明这样的函数

template<typename ...F>
static bool doEvaluation(F... args)
{
    return... args->execute();
}

像这样执行

doEvaluation(new A(), new B(), new C());

最后在编译时得到这样的东西?

return new A()->execute() && new B()->execute() && new C()->execute();

1 个答案:

答案 0 :(得分:1)

您可以按照以下方式实施类似的内容:

#include <functional>
// overload for single argument
template <typename T>
constexpr bool check(T&& f) {
    return f();
}

// extract the first parameter then recursively call self for others
template <typename U, typename... T>
constexpr bool check(U&& f, T&&... t) {
    // this will short-circuit...
    return f() && check(std::forward<T>(t)...);
}

template <typename T, bool V>
struct A {
  // this method can be called at compile time
  constexpr bool operator()() const {
      return V;
  }
};

int main()
{
  constexpr auto v1 = check(A<int, true>{}, A<int, false>{}, A<double, true>{});
  static_assert(v1 == false, "expected false!");
  constexpr auto v2 = check(A<int, true>{}, A<int, true>{}, A<double, true>{}, A<float, true>{});
  static_assert(v2, "expected true!");
}

我确信可以进一步简化这一点。继承的东西不是必需的,标志的计算是在编译时完成的。