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(), "");
};
どちらにも、最初の引数が true であることを確認するためのアサーション (それぞれ実行時またはコンパイル時) が含まれています。
次の入力を与える
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
ifと評価できます。A() == true
any_comp <B...>
私の質問は、この実験とその結論が有効かどうか、そして標準がそれについて何と言うかということです.
結論が有効である場合、コンパイルを高速化するために、いくつかのコンパイル時関数をより慎重に (より特殊化して) 再実装する必要があるため、これは重要です。