use*_*545 10 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;
}
};
Run Code Online (Sandbox Code Playgroud)
当我尝试使用该代码时,我收到一个错误invalid conversion from const char* to int.我怀疑这是因为编译器将模板"扩展"为单独的函数,当我指定结构的新实例时,throw Jam<std::string>(&setme);它检测到该var* = 25语句并拒绝编译.
有没有正确的方法来做到这一点?也许有宏观警卫?谢谢.
K-b*_*llo 12
改为使用常规函数重载:
template <class T>
struct Jam
{
Jam(std::string* var)
{
*var = "Hello!";
}
Jam(int* var)
{
*var = 25;
}
};
Run Code Online (Sandbox Code Playgroud)
除非你想专门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
}
};
Run Code Online (Sandbox Code Playgroud)
查找"部分模板专业化".
把Jam()的身体从Jam {}中取出来:
template <class T>
struct Jam
{
Jam(T *var);
};
Run Code Online (Sandbox Code Playgroud)
现在写两个机构:
Jam<int>::Jam(int *var) {
// stuff
}
Jam<std::string>::Jam(std::string *var) {
// stuff
}
Run Code Online (Sandbox Code Playgroud)
(警告:生锈的C++.但这通常是你如何做到的.)
新问题:如果你需要鸭子打字,你为什么要使用C++?我转而使用Ruby,并为需要速度的插件保存C++.但是C++仍然会支持优雅的设计,还有更多的工作!