Można wprowadzić strukturę depedent_type
, która zapobiega 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) { /*...*/ }
}
Które w Twojej przykładzie: (. To zachowanie jest wyjaśnione na 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
Jeśli chcesz, aby a.foo(1.0)
C Błąd ompilation, trzeba ograniczyć pierwszy przeciążeniem:
template <typename T>
auto foo(T) -> std::enable_if_t<std::is_same<T, int>{}> { }
Technika ta sprawia, że powyżej przeciążenie foo
podjąć tylko int
argumenty: niejawne konwersje (np float
do int
) są niedozwolone. Jeśli nie jest to to, czego chcesz, rozważ odpowiedź TemplateRex.
wandbox example
(Z powyższej ograniczonej funkcji, jest ciekawy interakcji pomiędzy dwoma przeciążeń podczas a.foo<int>(1)
nazywa. I asked a question about it jak nie jestem pewien zasad leżących u ich podstaw, które je prowadzą.)
Czy jesteś pewien, że to konieczne? Dlaczego nie po prostu specjalizować szablon 'int' zamiast przeciążać funkcję? –
@ChristianHackl po prostu wykonaj 'foo (double) = delete', zobacz moją odpowiedź. – TemplateRex