规避模板专业化

假设我是某个模板库( 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; }; 
  1. 打开标准的某个实现
  2. Ctrl + A
  3. Ctrl + C
  4. 创build一个名为"my_hector.h"的新文件
  5. Ctrl + V
  6. 删除专业化
  7. 使用#include "my_hector.h"search并replace#include <hector>
    [编辑@Xeo ;-)]
  8. 重命名以两个前导下划线和小写字母开头的标识符,以及以一个大写字母后跟一个前导下划线开头的所有标识符。