我有一个关于泛型返回类型专门化函数的简单问题。我还没有找到另一个帖子来回答我的问题,但也许那个帖子存在,我只是不理解它(或者我还没有找到它)。所以,希望这不是重复,但它是这样的:
下面的代码说明了我的问题:
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等)。一种明显的方法是为每个需要的类型编写一个单独的函数。另一种方法是通过引用传递变量,而不是返回值,并为每种类型重载函数。
然而,我认为一个专门的函数会使代码更具可扩展性。我的目标是导致泛型情况发生错误,并出现一些错误消息,如"我还没有为您的目标类型实现解析器",";而每个特殊情况将实现适当的字符串到类型解析器。我认为这将允许我在不修改原始类文件的情况下为新类型添加解析器,这对我来说是相关的,因为我正在将这个参数解析器构建到一个库中。
好的,希望这是有意义的。我更感兴趣的是解释为什么代码不能做我期望的事情,而不是解决方案,但两者都是值得赞赏的!
该函数的专门化被"隐藏"在.cpp文件中,因此编译器在编译main
(可能只包括A.h
)时永远不会看到它。
A.h
中声明专门化:
class A {
// ...
};
template<> double A::func<double>();
如果您保留inline
,您可能还可以将函数的整个定义移动到头文件中。