我有一些课程可以检查。实现此功能的代码在头文件中声明一个函数模板,并将其专门用于不同的源文件:
// 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。
如果我想专门化我的函数模板,我是否应该在头文件中声明我的所有专门化?