我想我一直在盯着这个看了太长时间,但是在这里找不到我的错误:

struct
{
    bool empty() const
    {
       return true;
    }
} hasEmpty;

template<typename T>
struct has_empty
{
private:
    template<typename U, U>
    class check {};

    template<typename C>
    static char f(check<void (C::*)() const, &C::empty> *);

    template<typename C>
    static long f(...);

public:
    static const bool value = (sizeof(f<T>(nullptr)) == sizeof(char));
};

template<typename T>
typename std::enable_if<has_empty<T>::value>::type foo(const T& t)
{

}

void x()
{
    foo(hasEmpty);
}

Visual Studio 2012报告:
error C2893: Failed to specialize function template 'std::enable_if<has_empty<T>::value>::type foo(const T &)'
1>          With the following template arguments:
1>          '<unnamed-type-hasEmpty>'

(请注意,我真的很喜欢here描述的该测试的新C++ 11版本,但VS2012目前还不支持constexpr。)

最佳答案

您的hasEmpty::empty方法返回bool:

struct
{
    bool empty() const
    {
       return true;
    }
} hasEmpty;

但是您的特征使用返回void的成员函数指针,该替换将始终失败。您应该更改此:
template<typename C>
ctatic char f(check<void (C::*)() const, &C::empty> *);

为了这:
template<typename C>
static char f(check<bool (C::*)() const, &C::empty> *);

那为我编译。

关于c++ - enable_if和has_member怎么了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12021803/

10-10 08:08