Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 根据模板变量类型执行不同的方法_C++_Templates_Types_Typeid - Fatal编程技术网

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

C++ 根据模板变量类型执行不同的方法,c++,templates,types,typeid,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*)

有没有一种方法可以确定传递给模板的变量类型,并根据它是
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;
     }
};
模板
结构堵塞
{
干扰(T*var)
{
if(typeid(var)=typeid(std::string*)
*var=“你好!”;
else if(typeid(var)=typeid(int*)
*var=25;
}
};
当我尝试使用该代码时,我得到一个错误
从const char*到int的无效转换。我怀疑这是因为编译器将模板“扩展”为单独的函数,并且当我指定结构的新实例
时抛出Jam(&setme);
它检测到
var*=25
语句并拒绝编译


有没有合适的方法可以做到这一点?也许可以使用宏保护?谢谢。

使用常规函数重载:

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

    Jam(int* var)
    {
        *var = 25;
    }
};
查找“部分模板专门化”

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

template <class T>
struct Jam
{
  Jam(T *var);
};
模板
结构堵塞
{
Jam(T*var);
};
现在写两个机构:

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

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

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


新问题:如果你需要鸭式输入,为什么你要使用C++?我会切换到Ruby,并保存C++,以支持需要速度的插件。但是C++仍然支持优雅的设计,更多的工作!

还有其他的选择,例如只对构造函数(<代码>模板卡纸::CAMI(int *var){})
在模板类定义之外)或更复杂的SFINAE来启用/禁用基于模板参数的代码…我认为这在这个简单的问题上没有意义,但当这些简单的解决方案成为负担时可能有意义(假设构造函数做了100件事,其中只有一件事依赖于类型,或者有100个其他成员函数,专门化整个类型会很昂贵)+ 1,虽然这不是通常称为部分模板特化的部分模板专门化的部分通常指的是,专门化只适用于一个子类型的类型,而与所有模板参数固定的完全专用化相比。天哪。我知道C++。希望什么都不例外。洛德!@Phlip我刚刚在一次航天飞机发射中使用了你的密码。它着火了,杀死了里面的所有人,摧毁了一座城市,都是因为你的密码。非常感谢。
Jam<int>::Jam(int *var) {
   // stuff
}

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