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