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