Iは、以下のアプローチを使用して第1 void_t
ことなく、is_union_or_class
を実装しようとした:C++ 2つのis_union_or_class実装
#include <type_traits>
namespace detail {
template <class T>
struct is_union_or_class_helper1 : public std::false_type { };
template <class T>
struct is_union_or_class_helper1<char T::*> : public std::true_type { };
}
template <class T>
struct is_union_or_class1 : public detail::is_union_or_class_helper1<T> { };
そしてIはfalse
に評価ダミー空のクラスとvalue
部材を使用して試験しました。そして、私はこのようなvoid_t
を使用して再試行:
#include <type_traits>
template <class...>
using void_t = void;
namespace detail {
template <class T, class = void_t<T>>
struct is_union_or_class_helper2 : public std::false_type { };
template <class T>
struct is_union_or_class_helper2<T, void_t<char T::*>> : public std::true_type { };
}
template <class T>
struct is_union_or_class2 : public detail::is_union_or_class_helper2<T> { };
そして、それはtrue
に正しく評価され、この時間。なぜ結果は異なるのですか?両方のヘルパーは、char T::*
が有効な式である場合にはより専門的です。なぜなら、2番目のケースのヘルパーだけがtrue_type
から継承するのはなぜですか? MSVC 2015コンパイラでこのコードとテストをコンパイル
struct dummy_type { };
int main(int argc, char** argv) {
std::cout << is_union_or_class1<dummy_type>::value << "\n";
std::cout << is_union_or_class2<dummy_type>::value << "\n";
}
I:ここではテストコードです。
あなたのスペシャライゼーションはさまざまなことをしています - 渡されたパラメータがメンバ変数へのポインタと見なせるタイプであれば最初のテスト、指定したタイプのメンバへのポインタ型を作成できる場合は2番目のテスト、変数... –
Tがメンバーオブジェクトの有効なホストであるかどうかをテストするべきではありませんか? –
いいえ型がメンバーオブジェクトへのポインタかどうかをテストします。 –