首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨库的模板函数专用符号匹配

跨库的模板函数专用符号匹配
EN

Stack Overflow用户
提问于 2014-06-22 23:48:57
回答 2查看 678关注 0票数 3

到目前为止,我已经设置了一个函数模板getF是这样在标题中声明的

代码语言:javascript
复制
template <typename T> F* getF();

函数体未定义。然后,在共享库上,getF有一些专门化。

代码语言:javascript
复制
template<>
F* getF<int>()
{
  static int r = 42;
  static Finstance(r);
  return &Finstance;
}

template<>
F* getF<float>()
{
  static float r = 3.14159;
  static Finstance(r);
  return &Finstance;
}

上面的操作非常好,因为在客户端可执行文件上,当我调用getF<float>()时,链接器将替换为适当的引用,如果库中不存在专门化,则编译将失败,出现链接器错误(这是所需的行为)。

但是,现在在行为上应该有一个小的改变:当结果不是针对给定的模板参数专门化时,代码应该构建,但是在运行时返回0。因此,我所做的就是修改getF的声明,如下所示:

代码语言:javascript
复制
template <typename T> F* getF() { return 0; }

问题是,现在编译器将在所有情况下使用这个定义,而不管库中是否有专门化。

问题:是否有其他方法在运行时为函数提供一些默认行为,而不将专门化移到头文件中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-23 01:11:25

最好的解决方案是声明库的显式专门化存在。

代码语言:javascript
复制
// All in the same header file:
template <typename T> F* getF() { return 0; }
template <> F* getF<int>();
template <> F* getF<float>();

这符合第14.7.3/6号标准的规定:

如果模板、成员模板或类模板的成员是显式专门化的,则应在首次使用该专门化之前声明该专门化,这将导致在发生此类使用的每个翻译单元中进行隐式实例化;不需要进行诊断。

票数 4
EN

Stack Overflow用户

发布于 2014-06-23 00:52:16

本质上,您需要以下内容:“在T为int或float时启用F的特殊情况”。这正是像boost::enable_if和std::enable_if这样的构造的意义所在。

在启用/禁用函数与类(类更容易)方面有细微的差别。参见这里的好例子:if not in function signature

您可能需要一些MPL (Boost )来表示规则的“或”部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24356807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档