首页 > 解决方案 > SFINAE 检查失败

问题描述

以下 SFINAE 测试无法检查某物是否是鸭子(如果存在“void quack()”成员函数,则它是鸭子)。我不明白为什么。任何想法 ?

struct Duck
{
    void quack() {}
};

struct Pig
{
    void groink() {}
};

template<class T>
auto test_duck(const T& t, int)
    -> decltype(t.quack(), bool())
{
    return true;
}

template<class T>
auto test_duck(const T& t, long)
{
    return false;
}

template<class T>
bool is_duck(const T& t)
{
    return test_duck(t, 0);
}    

int main()
{
    Duck duck;
    Pig pig;

    cout << is_duck(duck) << endl;  
    cout << is_duck(pig) << endl;
}

标签: c++templatessfinae

解决方案


问题是您正在传递 aconst Duck&Duck只有一个非常量quack()方法。

编辑:看起来评论已经及时解决了。如果@PiotrSkotnicki 想发布答案(而不是在评论中回答),我将删除它。


推荐阅读