1

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 を使用してみましたが、関数テンプレートのパラメーターをデフォルトにできないというエラーが発生しました。

4

1 に答える 1