根据模板变量类型执行不同的方法

时间:2012-06-13 18:39:58

标签: c++ templates types typeid

有没有办法确定传递给模板的变量类型,并根据它是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语句并拒绝编译。

有没有正确的方法呢?也许有宏观警卫?感谢。

2 个答案:

答案 0 :(得分:12)

改为使用常规函数重载:

template <class T>
struct Jam
{
    Jam(std::string* var)
    {
        *var = "Hello!";
    }

    Jam(int* var)
    {
        *var = 25;
    }
};

除非您想专门使用用于实例化T的{​​{1}}类型。在这种情况下,你会这样做:

Jam

答案 1 :(得分:6)

查找“部分模板专业化”。

将Jam()的身体从Jam {}中取出:

template <class T>
struct Jam
{
  Jam(T *var);
};

现在写两个实体:

Jam<int>::Jam(int *var) {
   // stuff
}

Jam<std::string>::Jam(std::string *var) {
   // stuff
}

(警告:生锈的C ++。但这通常是你如何做到的。)

新问题:如果你需要鸭子打字,你为什么要使用C ++?我转而使用Ruby,并为需要速度的插件保存C ++。但是C ++仍然会支持优雅的设计,还有更多的工作!