我有一个n-any布尔OR
运行时函数any_run
#include <assert.h>
bool any_run() { return false; }
template <typename... B>
bool any_run(bool a, B... b)
{
assert(a);
return a || any_run(b...);
}
以及编译时模拟any_comp
#include <type_traits>
template <bool E>
using expr = std::integral_constant <bool, E>;
using _true = expr <true>;
using _false = expr <false>;
template <typename... A>
struct any_comp : public _false { };
template <typename A, typename... B>
struct any_comp <A, B...> : public expr <A() || any_comp <B...>()>
{
static_assert(A(), "");
};
两者都包含断言(分别是运行时或编译时),以确保第一个参数为真。
现在提供以下输入
int main()
{
any_run (true, false, false);
any_comp <_true, _false, _false>();
}
运行时断言永远不会失败,但编译时会断言。这意味着永远不会调用any_run(false, false)
,但any_comp <_false, _false>
会实例化,尽管布尔常量表达式
A() || any_comp <B...>()
如果true
没有实例化A() == true
,可以评估为any_comp <B...>
。
我的问题是这个实验及其结论是否有效,以及该标准对此有何看法。
这很重要,因为如果结论有效,我必须更仔细地重新实现几个编译时函数(使用更多的特化)以使编译更快,尽管我通常更喜欢尽可能简单。
答案 0 :(得分:3)
短路仅适用于||
的运行时级别。在编译时,您需要其他类似的东西:
#include <type_traits>
template <typename T, typename U>
struct integral_or : U { };
template <typename U>
struct integral_or <std::true_type, U> : std::true_type { };
template <typename... A>
struct any_comp : std::false_type { };
template <typename A, typename... B>
struct any_comp <A, B...> : integral_or <A, any_comp <B...>>
{
static_assert(A(), "");
};
int main()
{
any_comp <std::true_type, std::false_type, std::false_type>();
}