*unique_ptr*typedef foo_type pointer;
がデリータでオプションを管理する方法には驚きました。私はビジュアルスタジオ2012の実装を見て、例のために小さな実装を取り除きました:
// this helper defined a type named Type as Traits::Type if it exists
// otherelse it is defined as Implicit
template < class Implicit, class Traits >
class ResolveType {
class WrapInt {
public:
WrapInt( int );
};
template < class T >
static auto MyFn( int ) -> typename T::Type;
template < class T >
static auto MyFn( WrapInt ) -> Implicit;
public:
typedef decltype( MyFn<Traits>(0) ) Type;
};
さて、これを書くことができれば: struct A { typedef unsigned int Type; }; 構造体 B { };
typedef ResolveType< int, A >::Type ResultA; // this will resolve to unsigned int
typedef ResolveType< int, B >::Type ResultB; // this will resolve to int
驚くべきことは、MyFn
内部で B を使用する場合の不正な形式です。存在しないためですResolveType
。typename B::Type
3 つの質問があります。2.これが正しい標準的な行動である場合、その黒魔術の背後にあるルールは何ですか? 3.これは *enable_if* と関係がありますか?関数のオーバーロードの拒否を許可する方法のロジックを理解するのが難しいため、署名を無効にすることで上記の例と少し同じように?
ありがとう。