【发布时间】:2020-03-02 19:17:17
【问题描述】:
我有一些可以检查的课程。实现这一点的代码在头文件中声明了一个函数模板,并将其专门用于不同的源文件:
// 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 时,我不需要触摸头文件,因为它定义了一个非常宽的接口。如果我忘记为Class3 实现check 函数,链接器会用错误消息提醒我。
我的问题是:这种行为是有保证的,还是我的代码是靠运气工作的?我正在使用 Visual Studio。
如果我想特化我的函数模板,我不应该在头文件中声明我的所有特化吗?
【问题讨论】:
-
你的主要是如何得到
Class1和2的定义的? -
我实际上在单独的源文件中定义了我的类。我会更新代码;我希望这不会让它太混乱。
-
从技术上讲,该程序是 UB,它违反了ODR。实际上,我无法想到它何时会成功编译和链接..
-
为什么不使用常规重载?
-
为什么要使用明显未实现的函数模板的显式模板特化而不是重载?
标签: c++ undefined-behavior template-specialization function-templates translation-unit