有没有办法确定传递给模板的变量类型,并根据它是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
语句并拒绝编译。
有没有正确的方法呢?也许有宏观警卫?感谢。
答案 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 ++仍然会支持优雅的设计,还有更多的工作!