规避模板专业化

时间:2011-06-27 21:12:22

标签: c++ templates template-specialization

假设我是某个模板库(CTL)的用户,该模板定义了一个模板,名为Hector

template <class T>
class Hector {...};

在其文档中,它提供了许多关于Hector模板行为的保证。 但是它还定义了某种类型Cool

的特化
template <>
class Hector<Cool> {....};

专业化的目的是更优化Hector的实施,但遗憾的是,由于此优化,违反了Hector的许多保证。

目前我真的不需要优化,我宁愿保留Hector的所有保证。有没有办法,如果不改变库代码(CTL是一个非常受尊敬的库,你知道),绕过专业化?有什么办法吗?也许写一些包装?什么?我只是希望编译器以正常的,非优化的方式为Hector<Cool>生成代码,并提供所有保证。

5 个答案:

答案 0 :(得分:12)

您可以在虚拟类型中包裹cool,以防止模板专门化。

答案 1 :(得分:12)

您是否可以使用没有不受欢迎的专业化的相关模板Reque?否则我认为您需要为Cool创建一个包装器,以便不使用特化。

答案 2 :(得分:8)

没有。即使它可以以某种深奥的方式完成,也不要。规避语言功能应引发警报。

您必须包装该值或使用其他类型,例如char而不是bool(它们的行为相似),而不是std::vector<char>,而是std::vector<bool>

答案 3 :(得分:7)

这是一个小小的通用伪装:

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;
};

答案 4 :(得分:0)

  1. 打开标准某些实现
  2. 控制 + A
  3. 控制 + C
  4. 创建名为"my_hector.h"
  5. 的新文件
  6. 控制 + V
  7. 删除专业化
  8. 使用#include <hector>搜索并替换#include "my_hector.h" [编辑@Xeo ;-)]
  9. 重命名以两个前导下划线后跟小写字母开头的标识符,以及以大写字母后跟单个前导下划线开头的所有标识符。