规避模板专业化
假设我是某个模板库( CTL
)的用户,它定义了一个名为Hector
的模板
template <class T> class Hector {...};
而在它的文档中,它提供了关于Hector
模板行为的许多保证。 但是,它也定义了一个特定types的专业化Cool
template <> class Hector<Cool> {....};
专业化的目的是Hector
更优化的实施,但不幸的是,由于这种优化, Hector
许多保证被违反。
目前我真的不需要优化,我宁愿保留Hector
所有保证。 有什么办法可以在不改变库代码的情况下( CTL
是一个非常值得尊敬的库,你知道),规避专业化? 任何方式呢? 也许写一些包装? 什么? 我只是希望编译器以正常的,非优化的方式为Hector<Cool>
生成代码,并具有所有的保证。
你能够使用没有不需要的专门化的相关模板Reque
吗? 否则,我认为你需要创build一个Cool
的包装,使专业化不被使用。
你可以用一个虚拟types来包装酷,以防止模板专门化它。
不,即使可以用一些深奥的方式来完成,不要。 规避语言function应引起警报。
你必须包装值或使用不同的types,如char
而不是bool
(他们的行为相似),给std::vector<char>
而不是std::vector<bool>
。
这是一个通用的伪装:
template <typename T> struct Drool { Drool(T d) : b(d) { } inline operator T() const { return b; } inline Drool<T> & operator=(T d) { b = d; return *this; } private: T b; };
现在你可以说Hector<Drool<Cool>>
。
根据Xeo改进的版本:
template <typename T> struct Drool { Drool(const T & d) : b(d) { } Drool(Drool && o) = default; inline operator const T & () const { return b; } inline operator T & () { return b; } private: T b; };
- 打开
标准的某个实现 - Ctrl + A
- Ctrl + C
- 创build一个名为
"my_hector.h"
的新文件 - Ctrl + V
- 删除专业化
- 使用
#include "my_hector.h"
search并replace#include <hector>
[编辑@Xeo ;-)] - 重命名以两个前导下划线和小写字母开头的标识符,以及以一个大写字母后跟一个前导下划线开头的所有标识符。