Я использую 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;
}

Он мог бы соответствовать им обоим.

2
Kanony 9 Апр 2021 в 09:04

1 ответ

Лучший ответ

Он мог бы соответствовать им обоим.

В разрешении перегрузки первая перегрузка выигрывает у второй, которая принимает многоточие параметр.

  1. Стандартная последовательность преобразования всегда лучше, чем пользовательская последовательность преобразования или последовательность преобразования с многоточием.
3
songyuanyao 9 Апр 2021 в 06:24