首页 > 解决方案 > 为什么在 SFINAE 中调用该函数并不模棱两可?

问题描述

我正在使用 SFINAE 检查某个类是否具有 'print()' 功能。代码有效,但为什么调用has_print()不是模棱两可的?

class cls {
public:
    void print() {
        std::cout << "some text" << std::endl;
    }
};

template<typename T>
auto has_print(T tt) -> decltype(T().print(), std::true_type()) {
    tt.print();
    return std::true_type();
}

std::false_type has_print(...) {
    std::cout << "Doesn't contain print()" << std::endl;
    return std::false_type();
}

int main() {
    cls c;
    has_print(c);

    return 0;
}

它可以匹配他们两个。

标签: c++sfinae

解决方案


它可以匹配他们两个。

重载决议中,第一个重载赢得第二个采用省略号参数的重载。

  1. 标准转换序列始终优于用户定义的转换序列或省略号转换序列。

推荐阅读