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

use*_*545 10 c++ templates types typeid

有没有一种方法来确定传递给一个模板变量的类型,并调用基于函数,如果它是一个intstd::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)


Phl*_*lip 6

查找"部分模板专业化".

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

  • 哇靠.我认识C++?希望没有爆炸! (2认同)