我应该声明我的函数模板专长还是定义足够?

我有一些可以检查的课程。实现此功能的代码在头文件中声明一个功能模板,并在不同的源文件中对其进行专门处理:

// check.h
template <class T>
bool check(const T& object);
// class1.h
struct Class1 {int mass;};
// check_class1.cpp
#include "class1.h"
#include "check.h"
template <>
bool check(const Class1& object) {return object.mass < 100;}
// class2.h
struct Class2 {int price;};
// check_class2.cpp
#include "class2.h"
#include "check.h"
template <>
bool check(const Class2& object) {return object.price < 1000;}
// class3.h
struct Class3 {int x;};
... // 10 more classes which I can check

此代码的用法如下:

#include "class1.h"
#include "class2.h"
#include "class3.h"
#include "check.h"

int main()
{
    Class1 object1{50};
    Class2 object2{500};
    Class3 object3{8};
    check(object1); // OK
    check(object2); // OK
    check(object3); // a link error appears here
}

这很好。当我添加另一个可以检查的类Class3时,我不需要触摸头文件,因为它定义了非常宽的接口。如果我忘记为check实现Class3功能,则链接器将通过一条错误消息提醒我。

我的问题是:这种行为是否得到保证,还是我的代码靠运气工作?我正在使用Visual Studio。

如果我想对函数模板进行专业化处理,是否应该在头文件中声明所有我的专业化处理?

feixuezhangluo 回答:我应该声明我的函数模板专长还是定义足够?

我将这些声明放在安全的一面(好吧,假设我出于任何原因都不会超载)。我认为法律对此不太清楚。首先,我们有

  

[temp.expl.spec]

     

6如果是模板,成员模板或类的成员   模板是专门的,那么专门化是   在第一次使用该专业化之前声明   在每个翻译单元中进行隐式实例化   发生了这种使用;无需诊断。如果程序   没有提供明确专业化的定义,并且   要么以一种会导致   进行隐式实例化或成员是虚拟成员   功能,程序格式错误,无需诊断。一个   隐式实例化永远不会为显式生成   已声明但未定义的专业化。

如果我没看错的话,这意味着如果将显式专业化添加到main.cpp,则它必须出现在之前 main。因为那是可能发生隐式实例化的地方。本段不会使您的代码完全脱离格式不正确的NDR,因为用法和显式专业化出现在不同的TU中。但这确实引起了人们的关注。

另一方面,有一段:

  

[温度]

     

7函数模板,类模板的成员函数,   变量模板或类模板的静态数据成员应为   在每个隐含的翻译单元中定义   实例化,除非显式地指定了相应的专业化   在某些翻译单元中实例化;无需诊断。

这一点使我们可以在单独的未看到的TU中明确地实例化。但这并没有为显式专业提供余地。我不能说这是故意还是遗漏。

它起作用的原因很可能是由于整个过程的实现方式。当函数声明被隐式实例化时,它会产生一个符号,恰好与显式专业化所产生的符号匹配。匹配的符号意味着一个快乐的链接器,因此所有内容都可以构建并运行。

但是从语言律师的角度来看,我认为我们可以将行为定义为无遗漏。它之所以未定义,仅仅是因为该标准未解决该问题。因此,回到我的开场白,我将它们添加到安全的一面,因为至少该位置是由标准解决的。

,

您必须在使用每个显式专门化之前对其进行声明。但是,您可以在标头中声明其专用类型。

// class2.h
struct Class2 {int price;};
template <class T>
bool check(const T& object);
template <>
bool check(const Class2& object)

(我仍然不明白为什么不能使用重载)。

本文链接:https://www.f2er.com/3153150.html

大家都在问