类标志的模板特化

时间:2011-11-01 09:19:02

标签: c++ templates specialization

我想知道下面的部分特化是否是正确的,有效的方式来实现这一点,我在这里定义基于通用List模板的有序和无序列表。

template <typename T, bool O> class List;                                       
template <typename T> class UList: public List<T,false>{};                      
template <typename T> class OList: public List<T,true>{};

谢谢,

2 个答案:

答案 0 :(得分:3)

对于类似这样的事情,我会使用策略类来定义事物如何插入到单个列表中,例如。

struct DefaultInsertionPolicy
{
  template <typename ContainerType, typename ValueType>
  static void insert(ContainerType& container, ValueType const& cValue)
  {
    container.insert(container.end(), cValue);
  }
};

struct SortedInsertionPolicy
{
  template <typename ContainerType, typename ValueType>
  static void insert(ContainerType& container, ValueType const& cValue)
  {
    // I'm using lower_bound here, but do what is necessary for you
    typename ContainerType::iterator ft = std::lower_bound(container.begin(), container.end(), cValue);
    container.insert(ft, cValue);
  }
};

template <typename T, typename InsertPolicy = DefaultInsertionPolicy>
class List
{
  :
  // insert function
  void insert(T const& cValue)
  {
    InsertPolicy::insert(*this, cValue); // delegate to the policy to do the insert
  }

  void insert(iterator iPos, T const& cValue)
  {
    // do the real insertion at the provided position.
  }
};

所以真正的类型可能是

typedef List<some_type> UList; // insertion order
typedef List<some_type, SortedInsertionPolicy> OList; // sorted list

答案 1 :(得分:1)

我认为您希望通过减少用户最终在其代码中使用的类的模板参数的数量来减少类模板的通用性。如果是这样,那么在C ++ 03和C ++ 98中,您就可以做到这一点,即定义源自更通用的类的不那么通用的类。

但是,在C ++ 11中,您不需要定义新的类模板。相反,您可以创建template aliases,同时减少模板参数的数量:

template <typename T> 
using UList = List<T,false>;                      

template <typename T> 
using OList = List<T,true>;

并使用UListOList,就好像它是一个带有一个类型参数的类模板:

UList<int> uints;
OList<float> ofloats;

wiki中,我刚刚学习了这种定义类型/别名的新方法,我们之前使用typedef执行此操作:

  

using语法也可以用作C ++ 11中的类型别名:

typedef void (*Type)(double);         // Old style
using OtherType = void (*)(double);   // New introduced syntax