规避模板专业化

Arm*_*yan 38 c++ templates template-specialization

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

template <class T>
class Hector {...};
Run Code Online (Sandbox Code Playgroud)

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

template <>
class Hector<Cool> {....};
Run Code Online (Sandbox Code Playgroud)

专业化的目的是更优化的实现Hector,但不幸的是,由于这种优化,许多保证Hector被违反.

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

Mik*_*ola 12

您可以在虚拟类型中包装冷却以防止模板专门化它.


Mar*_*k B 12

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


GMa*_*ckG 8

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

你必须包装值或使用不同的类型char而不是bool(它们表现相似),std::vector<char>而不是std::vector<bool>.

  • 谁提到性病和病媒? (4认同)
  • @Armen:"Cool"可能比"Shar"大但不小,而且"Shar"可以保证能够保存所有明确定义的"Cool"值. (4认同)
  • 我在Buzzkilling有博士学位. (2认同)
  • 我越想到这个问题,我就越认为这是正确的答案.毕竟,如果你想要的是'vector <bool>`表现得"正确",那么你必须愿意接受元素的地址(毕竟,你没有准确地说出你对Ctd :: Hector <Cool的期望>).因此,使用另一种整数类型确实有意义(并且将具有与bool相同的语义,与其他人使用包装器建议的解决方案相反).好消息是你甚至可以选择实施的大小. (2认同)

Ker*_* SB 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;
};
Run Code Online (Sandbox Code Playgroud)

现在你可以说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;
};
Run Code Online (Sandbox Code Playgroud)

  • 可以通过将参数作为const-refs并为C++ 0x添加move-ctor来使其更加通用,但除此之外,是的.此外,不需要`operator =`,因为它是隐式定义的. (2认同)