10

有没有办法确定传递给模板的变量的类型并根据它是否是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;
     }
};

当我尝试使用该代码时,出现错误invalid conversion from const char* to int。我怀疑这是因为编译器将模板“扩展”为单独的函数,当我指定结构的新实例时,throw Jam<std::string>(&setme);它检测到var* = 25语句并拒绝编译。

有没有合适的方法来做到这一点?也许有宏守卫?谢谢。

4

2 回答 2

12

改用常规函数重载:

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

    Jam(int* var)
    {
        *var = 25;
    }
};

除非您想专门研究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
    }
};
于 2012-06-13T18:42:29.847 回答
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++ 仍然会支持优雅的设计,需要做更多的工作!

于 2012-06-13T18:46:05.303 回答