具有泛型返回类型的专用函数

时间:2013-05-06 23:19:38

标签: c++ templates specialization template-function

我认为这是一个关于使用泛型返回类型专门化函数的简单问题。我无法找到另一个回答我的问题的帖子,但也许该帖子存在而我只是不理解它(或者我还没有找到它)。所以,希望这不是重复,但在这里: 以下代码说明了我的问题:
A.h

    class A {
        //...
        template<typename T> T func() { 
            cout << "Generic" << endl;
            T temp;
            return temp;
        }
    }

A.cpp

        //...
        template<> inline double A::func<double>() { 
            cout << "Double" << endl; 
            double d;
            return d;
        }

用法:

int main() {
    A a;
    int var1 = a.func<int>();
    double var2 = a.func<double>();
}

您可以从代码中收集的内容是,当 double 是模板参数时,我想要专门化泛型 func()函数。但是,在运行时我会看到:

  

通用

     

通用

而不是:

  

通用

     

为什么两次都会调用通用版本?我怎样才能得到我想要的行为?

我也会很快描述现实生活中的情况,如果我的问题的答案是“你可能永远不想这样做”。我只想编写一个将命令行参数(字符串)解析为各种数据类型(int,double,bool等)的类。一种显而易见的方法是为每种所需类型编写单独的函数。另一种方法可以是通过引用传递变量,而不是返回值,并为每种类型重载函数。

但是,我认为专门的函数会产生更多可扩展的代码。我的目标是导致一般情况发生错误,一些错误消息说“我还没有为你的目标类型实现解析器”,而每个专门案例都会实现相应的字符串到 type 解析器。我认为这将允许我为新类型添加解析器,而不必修改原始类文件,这与我相关,因为我正在将此参数解析器构建到库中。

好的,希望这是有道理的。我更感兴趣的是解释为什么代码没有做到我所期望的解决方案,但是要么感激了!

1 个答案:

答案 0 :(得分:3)

该函数的特化是“隐藏”在.cpp文件中,因此编译器在编译main时可能永远不会看到它(可能只包含A.h)。

要解决此问题,请在A.h

中声明专精
class A {
   // ...
};

template<> double A::func<double>();

如果保留inline,您可以将函数的整个定义移动到标题中。