1つの引数でコンストラクターを検出する方法を知っている人はいますか? たとえば、次の構造体は負の結果になるはずです。
struct MyStruct
{
MyStruct( int x, int x2 ) : y( x ) {}
int y;
};
ここでは、クラスまたは構造体が特定の数の引数を持つコンストラクターであるかどうかを確認するための優れた SFINAE チェックがあります。引数の数が 3 の場合は次のようになります。
template <typename T>
struct HasCtor3Args
{
struct Any { template <typename U> operator U( void ); };
template <typename U>
static int32 SFINAE( decltype( U( Any( ), Any( ), Any( ) ) ) * );
template <typename U>
static int8 SFINAE( ... );
static const bool value = sizeof( SFINAE<T>( NULL ) ) == sizeof( int32 );
};
Any
構造体は、パラメーターが本来あるべき型に変換できるため、これはうまく機能しているようです。ただし、問題は、引数が 1 つだけのコンストラクターを検出しようとする場合です。SFINAE チェックは、コピー コンストラクターを検出するAny
のと同じ型にデフォルト設定されるため、常に true を返すようです。T
編集と更新: 私はいくつかの試みをしましたが、どれもうまくいかないようです...これは私が得ることができる最も近いものでしたが、常にtrueを返すため機能しません. アイデアは、最初の「すべてをキャッチ」呼び出しの代わりに、コピー コンストラクターを解決しようとすることでした。
template <typename T>
struct HasCtor1Args
{
struct Any
{
template <typename U>
operator U( ) const;
};
template <typename U>
static int32 SFINAE( decltype( U( Any( ) ) ) * );
// Try to catch the copy ctor here
T MakeT( void );
template <typename U>
static int8 SFINAE( decltype( U( MakeT( ) ) ) * );
template <typename U>
static int8 SFINAE( ... );
static const bool value = sizeof( SFINAE<T>( NULL ) ) == sizeof( int32 );
};
また、C++ 11 の = delete 機能と共に明示的なキーワードを使用してみましたが、使用する必要があるコンパイラ (Microsoft の) ではこれが許可されていないことに気付きました。また、変換型 U で std::enable_if を使用してみましたが、関数テンプレートのパラメーターをデフォルトにできないというエラーが発生しました。