質問
テンプレートによるメタ関数の短絡評価の方法について質問です。
以下のコードをみてください。
cpp
1#include <type_traits> 2 3struct Hoge { 4 using value_type = int; 5}; 6 7struct Hige { 8 using value_type = int; 9}; 10 11struct Hage {}; 12 13template <class T> 14using check = std::conjunction<std::is_same<T, Hoge>, std::is_same<typename T::value_type, int>>; 15 16int main() 17{ 18 static_assert(check<Hoge>::value); // -> 当然OK 19 static_assert(check<Hige>::value); // -> static_assertに引っかかる 20 static_assert(check<Hage>::value); // -> static_assertに引っかかるのではなく、value_typeが無いと言われる 21}
上の3つのstatic_assertのうち下2つを「static_assertに失敗」させたいのですが、一番下はstruct内にvalue_typeの定義が無いため、"static_assetに失敗"ではなく、value_typeが存在しないというコンパイルエラーになります。
std::conjunctionは短絡評価すると書かれていたため、問題ないと思ったのですが間違っていたようです。
どのように実装すれば、typename T::value_typeの存在を評価せずに、その前段階のis_sameの時点でstd::false_typeにすることができますか?
教えて下さい...... よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/12 16:49