2

我一直在尝试使用一点 SFINAE 来确定泛型类型 T 是否具有我可以使用的复制构造函数。这是我目前所在的位置。

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 回答