【问题标题】:Template Partial Specialization - any real-world example?模板部分专业化 - 任何现实世界的例子?
【发布时间】:2009-08-27 16:47:27
【问题描述】:

我正在考虑partial specialization。虽然我理解这个想法,但我还没有看到这种技术在现实世界中的任何用法。 Full specialization 在STL 的许多地方都使用过,所以我对此没有问题。你能告诉我一个使用partial specialization的真实例子吗?如果示例在STL 中,那就更好了!

【问题讨论】:

  • 听起来像家庭作业;P
  • @Aiden 真的吗?!我认为他们不允许在大学里做这些事情!
  • @Arak ...我忘了拼贴全是 Java 和 MSWord .. 抱歉;)
  • @Aiden,现在你说的是实话:D
  • 在大学里没有人教我们 MS Word。 :(

标签: c++ templates partial-specialization


【解决方案1】:

C++0x 带有unique_ptr,它是auto_ptr 的替代品,auto_ptr 将被弃用。

如果您将unique_ptr 与数组类型一起使用,它会使用delete[] 来释放它,并提供operator[] 等。如果您将它与非数组类型一起使用,它会使用delete。这需要部分模板专业化,例如

template<typename T>
struct my_unique_ptr { ... };

template<typename T>
struct my_unique_ptr<T[]> { ... };

另一个用途(虽然非常有问题)是标准库中的std::vector&lt;bool, Allocator&gt;。 bool 特化使用空间优化将 bool 打包成单独的位

template<typename T, typename Allocator = std::allocator<T> >
struct vector { ... };

template<typename Allocator>
struct vector<bool, Allocator> { ... };

另一个用途是std::iterator_traits&lt;T&gt;。迭代器需要将嵌套的 typedef value_type、reference 和其他类型定义为正确的类型(例如,对于 const 迭代器,reference 通常是 T const&amp;),因此算法可以将它们用于工作。主模板依次使用迭代器类型的类型成员

template<typename T>
struct iterator_traits { 
  typedef typename T::value_type value_type; 
  ...
};

对于指针,这当然行不通。他们有部分专业化

template<typename T>
struct iterator_traits<T*> {
  typedef T value_type;
  ...
};

【讨论】:

  • 第二点很有趣...我不知道,这部分是标准还是编译器特定的?
  • @DeusAduro,是的,这是标准要求的。这是一个可能的误解的常见示例,因为它使vector&lt;bool&gt; 不再符合容器要求。
  • 呵呵,好老的向量。糟糕的设计决策,但它确实说明了部分专业化可能实现的一些事情。
【解决方案2】:

在一些 stl 实现中,集合如 std::vector 和 std::list 使用部分模板特化来减少为指针集合生成的代码量。

类型 T 的模板的每个实例化都会创建新代码。然而,指针类型实际上都是相同的,因此为每种类型生成新代码是一种浪费。这可以通过使用 void 指针实现指针集合的私有部分,然后将它们转换为公共接口中的适当类型来减少。这大大减少了为指针集合生成的代码。

我认为这在 Effective STL 中有所涉及。

【讨论】:

  • +1 提示优化 T*(我也可以在我自己的模板类中使用)
  • 哇,我不知道这个,但听起来合乎逻辑。 C++ 在引擎盖下真是太酷了……哦,等等,它没有设计引擎盖 :)
【解决方案3】:

取自 MSDN(类模板的部分专业化 (C++))

// partial_specialization_of_class_templates.cpp
template <class T> struct PTS {
   enum {
      IsPointer = 0,
      IsPointerToDataMember = 0
   };
};

template <class T> struct PTS<T*> {
   enum {
      IsPointer = 1,
      IsPointerToDataMember = 0
   };
};

template <class T, class U> struct PTS<T U::*> {
   enum {
      IsPointer = 0,
      IsPointerToDataMember = 1
   };
};

【讨论】:

  • @Dwefy,我不会对你的帖子投反对票 :) 但我不是在问什么是部分专业化。谢谢...
  • 但它看起来是部分规范的好样本,甚至更多。它将更多类型注入到单一模板中,允许您选择要专门化的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2019-02-06
相关资源
最近更新 更多