Удалить шаблонную функцию, кроме одной ее специализации - PullRequest
1 голос
/ 06 июля 2019

Вместо удаления специализаций иногда удобнее удалить саму функцию шаблона, но для одной из ее специализаций.

Пример:

template<typename T>
bool IsLucky(T) = delete;


bool IsLucky<int>(int n) {
return !(n%7);
}
// I guess bool IsLucky(int n) will not help my cause

С помощью вывод аргумента шаблона , здесь я могу гарантировать, что без использования угловых скобок не произойдет неявного преобразования.

char c='F';
IsLucky(c); // Will not compile

Есть ли недостатки этого подхода?

1 Ответ

0 голосов
/ 06 июля 2019

Простая перегрузка функций здесь работает очень хорошо:

template<typename T>
bool IsLucky(T) = delete;

inline bool IsLucky(int n) {
    return !(n%7);
}

int main() {
    IsLucky(1);
    IsLucky(1u);  // error: use of deleted function ‘bool IsLucky(T) [with T = unsigned int]’
    IsLucky('1'); // error: use of deleted function ‘bool IsLucky(T) [with T = char]’
}

В качестве примечания, с точки зрения времени компиляции, SFINAE может значительно замедлить время компиляции .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...