【问题标题】:Specializing functions with generic return types具有通用返回类型的特化函数
【发布时间】:2013-05-06 23:19:37
【问题描述】:

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

    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 等)的类。一种明显的方法是为每种所需类型编写一个单独的函数。另一种方法是通过引用传递变量,而不是返回值,并为每种类型重载函数。

但是,我认为一个专门的函数会使代码更具可扩展性。我的目标是导致通用案例发生错误,并带有一些错误消息,例如“我还没有为您的目标类型实现解析器”,而每个特殊案例都将实现适当的 string-to-类型解析器。我认为这将允许我为新类型添加解析器,而无需修改原始类文件,这与我相关,因为我正在将此参数解析器构建到库中。

好的,希望这是有道理的。我更感兴趣的是解释为什么代码没有达到我期望的效果而不是解决方案,但是任何一个都值得赞赏!

【问题讨论】:

  • 你把main()放在哪个文件里?

标签: c++ templates specialization template-function


【解决方案1】:

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

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

class A {
   // ...
};

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

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

【讨论】:

  • 当我拿到他的代码时它甚至没有编译,当我得到它时它的行为符合预期
  • 这是否意味着如果我想添加另一个专门版本的函数,那么我必须编辑原始头文件?换句话说,有没有办法完成我在问题中描述的场景?
  • @aaronman 这是不完整的代码。添加#includes 应该是剩下的。你能告诉我你用的是什么编译器吗?我通过 Cygwin 使用 GCC 4.5.3。
  • @womple 不,没有。使用模板,编译器需要能够在调用点看到整个定义。
  • @Praetorian 啊,好的。感谢您的澄清!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 2016-09-22
  • 2021-01-03
  • 1970-01-01
相关资源
最近更新 更多