Выполните различные методы, основанные на типе переменной шаблона

Есть ли способ определить тип переменной, переданной шаблону, и вызвать функцию на основе 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 и сохранил С++ для плагинов, которым нужна скорость. Но С++ по-прежнему будет поддерживать элегантный дизайн, с большим количеством работы!