我的一位同事告诉我,他和他的团队一起使用的一个小设计让我心潮澎湃。这是一种特征类,他们可以以一种极其解耦的方式进行专业化。
我很难理解它是如何工作的,而且我仍然不确定我的想法,所以我想我会在这里寻求帮助。
我们在这里谈论的是 g++,特别是 3.4.2 和 4.3.2 版本(似乎两者都适用)。
这个想法很简单:
1-定义接口
// interface.h
template <class T>
struct Interface
{
void foo(); // the method is not implemented, it could not work if it was
};
//
// I do not think it is necessary
// but they prefer free-standing methods with templates
// because of the automatic argument deduction
//
template <class T>
void foo(Interface<T>& interface) { interface.foo(); }
2-定义一个类,并在源文件中专门为这个类提供接口(定义它的方法)
// special.h
class Special {};
// special.cpp
#include "interface.h"
#include "special.h"
//
// Note that this specialization is not visible outside of this translation unit
//
template <>
struct Interface<Special>
{
void foo() { std::cout << "Special" << std::endl; }
};
3-使用起来也很简单:
// main.cpp
#include "interface.h"
class Special; // yes, it only costs a forward declaration
// which helps much in term of dependencies
int main(int argc, char* argv[])
{
Interface<Special> special;
foo(special);
return 0;
};
如果没有翻译单元定义Interface
for的特化,则它是一个未定义的符号Special
。
现在,我原以为这需要export
关键字,据我所知,该关键字从未在 g++ 中实现过(并且只在 C++ 编译器中实现过一次,考虑到他们花费的时间和精力,它的作者建议任何人不要这样做)。
我怀疑这与链接器解析模板方法有关...
- 你以前遇到过这样的事情吗?
- 它是否符合标准,或者您认为这是一个幸运的巧合?
我必须承认我对这个结构很困惑......