到目前为止,我已经设置了一个函数模板getF是这样在标题中声明的
template <typename T> F* getF();函数体未定义。然后,在共享库上,getF有一些专门化。
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的声明,如下所示:
template <typename T> F* getF() { return 0; }问题是,现在编译器将在所有情况下使用这个定义,而不管库中是否有专门化。
问题:是否有其他方法在运行时为函数提供一些默认行为,而不将专门化移到头文件中?
发布于 2014-06-23 01:11:25
最好的解决方案是声明库的显式专门化存在。
// 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号标准的规定:
如果模板、成员模板或类模板的成员是显式专门化的,则应在首次使用该专门化之前声明该专门化,这将导致在发生此类使用的每个翻译单元中进行隐式实例化;不需要进行诊断。
发布于 2014-06-23 00:52:16
本质上,您需要以下内容:“在T为int或float时启用F的特殊情况”。这正是像boost::enable_if和std::enable_if这样的构造的意义所在。
在启用/禁用函数与类(类更容易)方面有细微的差别。参见这里的好例子:if not in function signature
您可能需要一些MPL (Boost )来表示规则的“或”部分。
https://stackoverflow.com/questions/24356807
复制相似问题