gpt4 book ai didi

c++ - 专门化具有通用返回类型的函数

转载 作者:行者123 更新时间:2023-11-28 00:45:29 25 4
gpt4 key购买 nike

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

    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() 函数。但是,运行时我看到:

Generic

Generic

代替:

Generic

Double

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

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

但是,我在想一个专门的函数会产生更具可扩展性的代码。我的目标是导致一般情况发生错误,一些错误消息说“我还没有为您的目标类型实现解析器”,而每个特殊情况将实现适当的字符串到类型解析器。我认为这将允许我为新类型添加解析器而无需修改原始类文件,这与我相关,因为我正在将这个参数解析器构建到一个库中。

好的,希望这是有道理的。与解决方案相比,我更感兴趣的是解释为什么代码没有达到我的预期,但我不胜感激!

最佳答案

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

要解决此问题,请在 A.h 中声明特化:

class A {
// ...
};

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

如果您保留内联,您可能还可以将函数的整个定义移动到 header 中。

关于c++ - 专门化具有通用返回类型的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16408804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com