質問
テンプレートによるメタ関数の短絡評価の方法について質問です。
以下のコードをみてください。
cpp
#include <type_traits> struct Hoge { using value_type = int; }; struct Hige { using value_type = int; }; struct Hage {}; template <class T> using check = std::conjunction<std::is_same<T, Hoge>, std::is_same<typename T::value_type, int>>; int main() { static_assert(check<Hoge>::value); // -> 当然OK static_assert(check<Hige>::value); // -> static_assertに引っかかる static_assert(check<Hage>::value); // -> static_assertに引っかかるのではなく、value_typeが無いと言われる }
上の3つのstatic_assertのうち下2つを「static_assertに失敗」させたいのですが、一番下はstruct内にvalue_typeの定義が無いため、"static_assetに失敗"ではなく、value_typeが存在しないというコンパイルエラーになります。
std::conjunctionは短絡評価すると書かれていたため、問題ないと思ったのですが間違っていたようです。
どのように実装すれば、typename T::value_typeの存在を評価せずに、その前段階のis_sameの時点でstd::false_typeにすることができますか?
教えて下さい...... よろしくお願いします。
まだ回答がついていません
会員登録して回答してみよう