2

私は、ジェネリック型 T に使用できるコピー コンストラクターがあるかどうかを判断する方法を作成するために、少し SFINAE を試みてきました。これが私が現在いる場所です。

template <bool statement, typename out>
struct Failable
{
    typedef out Type;
};
//This class is only used to insert statements that 
//could encounter substitution failure


template <typename O>
struct COPY
{
    template <typename T>
    typename Failable<true == sizeof(&T::T(const T&)), char>::Type copy(int)
    {}

    template <typename T>
    typename Failable<true, int>::Type copy(...)
    {}

};

しかし、これは私がちょっと立ち往生しているところでもあります。 &T::T(const T&)たとえptm関数であっても、メンバーへのポインターを含む引数リストを提供できないため、明らかに無効なステートメントです。私はいつでも何らかのvoid (T::*ptmf)(const T&) = &T::T.

他の誰かが私がトレッキングできるアイデアを持っていますか? (代入演算子のチェックにも同様の概念を適用する必要があります。)

ありがとうございます。

4

2 に答える 2

8

これにはstd::is_copy_constructiblestd::is_assignableを使用できます。

于 2012-08-27T06:10:54.190 に答える
2

コードを少し変更するだけで、コードを実行できます。

template <bool statement, typename out>
struct Failable
{
     typedef out Type;
}; 

template <typename O>
struct COPY
{

     static O MakeO();

     template <typename U> // U and T are the same type
     static typename Failable<(sizeof U(MakeO())), char>::Type copy(int);

     template <typename U>
     static typename Failable<true, int>::Type copy(...);

     enum { value = sizeof(char) == sizeof( copy<O>(0) ) };
};
于 2013-03-25T14:39:13.697 に答える