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

Perform different methods based on template variable type

本文关键字:方法 执行 类型 变量      更新时间:2023-10-16

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

有没有正确的方法可以做到这一点?也许有宏观防护?谢谢。

改用常规函数重载:

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

除非您想专注于用于实例化Jam的类型T。在这种情况下,您将执行以下操作:

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
    }
};

查找"部分模板专用化"。

把 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++仍然会支持优雅的设计,还有更多的工作!