假设我有以下基础结构
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();
答案 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!");
}
我确信可以进一步简化这一点。继承的东西不是必需的,标志的计算是在编译时完成的。