我有这个函子:

struct functor
{
  template<class T> void operator()(T value)           // (*)
  {
    // process the value
  }
  template<> void operator()<const wchar_t *>(const wchar_t *value) // (**)
  {
    if (value)
    {
      // process the value
    }
  }
  template<> void operator()<const char *>(const char *value) // (**)
  {
    if (value)
    {
      // process the value
    }
  }
  template<> void operator()<wchar_t *>(wchar_t *value) // (**)
  {
    if (value)
    {
      // process the value
    }
  }
  template<> void operator()<char *>(char *value) // (**)
  {
    if (value)
    {
      // process the value
    }
  }
};

如您所见,我有4个相同的模板专长。是否有一种技术可以一次指定所有这些类型,这意味着以某种方式将所有可能的类型划分为主要组(*)和专用组(**)?

谢谢。

编辑

糟糕,修正了一些错别字。

最佳答案

您可以摆脱一个更简单的方案-超载!

template<class T>
void foo(T value){ // general
  // ...
}

template<class T>
void foo(T* value){ // for pointers!
  if(value)
    foo(*value); // forward to general implementation
}

另外,如果您不需要修改参数(或根据实际需要,也可以同时修改),我建议您将该参数作为引用-const:
template<class T>
void foo(T& value){ // general, may modify parameter
  // ...
}

template<class T>
void foo(T const& value){ // general, will not modify parameter
  // ...
}

如果您想为某些类型的集合(即整个集合的一个实现)提供特殊的实现,那么特征和标记分派(dispatch)可以帮助您:
// dispatch tags
struct non_ABC_tag{};
struct ABC_tag{};

class A; class B; class C;

template<class T>
struct get_tag{
  typedef non_ABC_tag type;
};

// specialization on the members of the set
template<> struct get_tag<A>{ typedef ABC_tag type; };
template<> struct get_tag<B>{ typedef ABC_tag type; };
template<> struct get_tag<C>{ typedef ABC_tag type; };

// again, consider references for 'value' - see above
template<class T>
void foo(T value, non_ABC_tag){
  // not A, B or C ...
}

template<class T>
void foo(T value, ABC_tag){
  // A, B, or C ...
}

template<class T>
void foo(T value){
  foo(value, typename get_tag<T>::type()); // dispatch
}

最重要的是,如果要对没有共同点的类型进行分组,则至少需要重复一些(标记,重载等)。

关于c++ - C++如何减少相同模板特化的数量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8842734/

10-17 01:40