Вы можете ввести структуру depedent_type
, которая предотвращает template argument deduction.
template <typename T>
struct dependent_type
{
using type = T;
};
struct A
{
void foo(int i) { /*...*/ };
template<typename T> void foo(typename dependent_type<T>::type t) { /*...*/ }
}
Что в вашем примере: (. Такое поведение объясняется на cppreference >template argument deduction >non-deduced contexts)
a.foo<int>(1); // calls the template
a.foo<double>(1.0); // calls the template
a.foo(1); // calls non-templated method
a.foo(1.0); // calls non-templated method (implicit conversion)
wandbox example
Если вы хотите сделать a.foo(1.0)
A C ошибка ompilation, вам нужно ограничить первую перегрузку:
template <typename T>
auto foo(T) -> std::enable_if_t<std::is_same<T, int>{}> { }
Этот метод делает выше перегрузки foo
принимать только int
аргументы: неявные преобразования (например, float
до int
) не допускаются. Если это не то, что вы хотите, рассмотрите ответ TemplateRex.
wandbox example
(С выше ограниченной функцией, есть любопытное взаимодействие между двумя перегрузками, когда a.foo<int>(1)
называется. Я asked a question about it, как я не уверен, лежащими в основе правил, которые определяют его.)
Вы уверены, что это необходимо? Почему бы не просто специализировать шаблон для 'int' вместо перегрузки функции? –
@ChristianHackl просто сделайте 'foo (double) = delete', см. Мой ответ. – TemplateRex