Выполните различные методы, основанные на типе переменной шаблона
Есть ли способ определить тип переменной, переданной шаблону, и вызвать функцию на основе if int
или std::string
и т.д.??
Например
template <class T>
struct Jam
{
Jam(T *var)
{
if (typeid(var) == typeid(std::string*)
*var = "Hello!";
else if (typeid(var) == typeid(int*)
*var = 25;
}
};
Когда я пытаюсь использовать этот код, я получаю сообщение об ошибке invalid conversion from const char* to int
. Я подозреваю, что это связано с тем, что компилятор "расширяет" шаблон в отдельные функции, и когда я указал новый экземпляр структуры throw Jam<std::string>(&setme);
, он обнаружил оператор var* = 25
и отказался от компиляции.
Есть ли правильный способ сделать это? Может быть, с помощью магов? Спасибо.
Ответы
Ответ 1
Вместо этого используйте регулярную перегрузку функции:
template <class T>
struct Jam
{
Jam(std::string* var)
{
*var = "Hello!";
}
Jam(int* var)
{
*var = 25;
}
};
если вы не хотите специализироваться на типе T
, используемом для создания экземпляра Jam
. В этом случае вы будете делать:
template<>
struct Jam<std::string>
{
Jam(std::string* var)
{
*var = "Hello!";
}
};
template<>
struct Jam<int>
{
Jam(int* var)
{
*var = 25;
}
};
template<typename T>
struct Jam
{
Jam(T* var)
{
// every other type
}
};
Ответ 2
Посмотрите "специализацию частичного шаблона".
Возьмите Jam() тело из Jam {}:
template <class T>
struct Jam
{
Jam(T *var);
};
Теперь напишите два тела:
Jam<int>::Jam(int *var) {
// stuff
}
Jam<std::string>::Jam(std::string *var) {
// stuff
}
(Предупреждение: Rusty С++. Но это вообще как вы это делаете.)
Новый вопрос: если вам нужна утка-типизация, почему вы используете С++ вообще? Я бы переключился на Ruby и сохранил С++ для плагинов, которым нужна скорость. Но С++ по-прежнему будет поддерживать элегантный дизайн, с большим количеством работы!