2016-04-15 5 views
2

У меня есть шаблон функции:неявное преобразование типа в шаблоне C++

template<typename T> 
void fun(T a, T b){ 
     ....... 
} 

int a = 0; 
double b = 1.2; 
f(a, b); 

может ли быть преобразованы автоматически в два раза?

+0

Почему вопрос был остановлен? Это законный вопрос. – SergeyA

+0

@SergeyA Я не делал downvote (читая его только сейчас), но вопрос немного неоднозначен и вообще не объясняет логику. Он не объясняет, нужно ли 'f (b, a)' преобразовывать 'double' в' int' или 'int', чтобы' double' или не удалось скомпилировать. Он не объясняет, хочет ли он этого лечения и для «короткого а; f (a, b) '. Ни те, которые являются поддерживаемыми типами «забавы». Я бы ответил: «Да, используйте удовольствие (double a, T b) *», но вопрос не содержит информации о том, бесполезно это или нет. Недостаточно оснований для меня. Я просто буду двигаться дальше и не буду беспокоиться. –

ответ

7

может быть преобразовано в двойное автоматически?

Нет, потому что это неоднозначный между fun<int> и fun<double>, при выводе типа T в template argument deduction.

Можно указать аргумент шаблона в явном виде, чтобы сделать a неявно преобразуется в double:

int a = 0; 
double b = 1.2; 
fun<double>(a, b); 

или добавить явное преобразование, чтобы сделать шаблон аргумента вывод однозначный:

int a = 0; 
double b = 1.2; 
fun(static_cast<double>(a), b); 
0

Нет, не может. В процессе вычитания шаблона нет конверсий. В этом случае мы получаем T независимо от a и b, получая int для a и double для b - так как мы вывели T быть двух различных типов, то есть отказ вычет.

Если вы хотите сделать преобразования, проще всего было бы либо явно сделать это самостоятельно:

f(static_cast<double>(a), b); 

Или явно предоставить параметр шаблона для f так, что ни вычет не происходит:

f<double>(a, b); 
0

Если вы хотите, чтобы параметр a был преобразован в тип параметра b, тогда вместо вашего нижеследующего шаблона использовать:

template<typename Ta, typename T> 
void fun(Ta aTa, T b) { 
    T& a = static_cast<T>(aTa); 
    /* ... a and b have the same type T ... */ 
} 

int a = 0; 
double b = 1.2; 
fun(a, b); // works fine