Вы можете специализировать свой шаблон для разных типов.Если вы начнете с базового случая:
template <class T>
void method(T value);
Затем вы можете объявить другое поведение для любого конкретного значения T
:
template <>
void method<int>(int value) {
// special behavior
}
и так далее.Но так как меняется только тип ввода вашей функции, вам действительно не нужны шаблоны в этом случае!Вы можете просто перегружать свою функцию различными типами аргументов:
void method(int T);
void method(float T);
void method(void* T);
EDIT : Использование специализации шаблона для получения имени типа и использования его в другом шаблоне функции:
template <class T>
std::string type_to_string();
template <>
std::string type_to_string<int>() {
return "int";
}
template <>
std::string type_to_string<float>() {
return "float";
}
template <class T>
some_other_function(T value) {
std::cout << value << " is a " << type_to_string<T>() << std::endl;
}
Конечно, вы все еще можете сделать это без шаблонов:
std::string type_to_string(int) {
return "int";
}
some_other_function(int value) {
std::cout << value << " is a " << type_to_string(value) << std::endl;
}
Если бы вам пришлось выполнять сложные вычисления на уровне типов, я бы предложил использовать шаблоны.Но здесь, я думаю, вы можете достичь того, что вы хотите, довольно приятно без них.В любом случае, идиоматический способ (с шаблонами или без них) состоит в том, чтобы разделить вашу функцию на отдельные части.