我一直在尝试使用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&)
显然是一个无效的语句,因为我们不能提供带有指向成员的参数列表,即使是p-t-m函数。
我总是可以尝试指定某种void (T::*ptmf)(const T&) = &T::T
,并希望它隐式确定正确的重载构造函数放入指向成员函数的指针,但这也意味着构造函数具有特定的返回类型,我将不得不指定。
是否有其他人有任何我可以跋涉的想法? (我还需要应用类似的概念来检查赋值运算符。)
先谢谢。
答案 0 :(得分:7)
答案 1 :(得分:1)
您可以使用您的代码,只需稍微修改一下。
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) ) };
};