基于继承类的模板特化

新手上路,请多包涵

我想把这个专门化,不改变主线。是否可以根据其基类专门化某些东西?但愿如此。

-编辑-

我将有几个继承自 SomeTag 的类。我不想为他们每个人写相同的专业。

 class SomeTag {};
class InheritSomeTag : public SomeTag {};

template <class T, class Tag=T>
struct MyClass
{
};

template <class T>
struct MyClass<T, SomeTag>
{
    typedef int isSpecialized;
};

int main()
{
    MyClass<SomeTag>::isSpecialized test1; //ok
    MyClass<InheritSomeTag>::isSpecialized test2; //how do i make this specialized w/o changing main()
    return 0;
}

原文由 user34537 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 438
2 个回答

这篇文章描述了一个巧妙的技巧: http ://www.gotw.ca/publications/mxc++-item-4.htm

这是基本的想法。您首先需要一个 IsDerivedFrom 类(它提供运行时和编译时检查):

 template<typename D, typename B>
class IsDerivedFrom
{
  class No { };
  class Yes { No no[3]; };

  static Yes Test( B* ); // not defined
  static No Test( ... ); // not defined

  static void Constraints(D* p) { B* pb = p; pb = p; }

public:
  enum { Is = sizeof(Test(static_cast<D*>(0))) == sizeof(Yes) };

  IsDerivedFrom() { void(*p)(D*) = Constraints; }
};

然后您的 MyClass 需要一个可能专门的实现:

 template<typename T, int>
class MyClassImpl
{
  // general case: T is not derived from SomeTag
};

template<typename T>
class MyClassImpl<T, 1>
{
  // T is derived from SomeTag
  public:
     typedef int isSpecialized;
};

MyClass 实际上看起来像:

 template<typename T>
class MyClass: public MyClassImpl<T, IsDerivedFrom<T, SomeTag>::Is>
{
};

然后你的主要方式会很好:

 int main()
{
    MyClass<SomeTag>::isSpecialized test1; //ok
    MyClass<InheritSomeTag>::isSpecialized test2; //ok also
    return 0;
}

原文由 Jesse Beder 发布,翻译遵循 CC BY-SA 2.5 许可协议

现在是 2014 年的简短版本,使用 C++-11:

 #include <type_traits>

struct SomeTag { };
struct InheritSomeTag : SomeTag { };

template<typename T, bool = std::is_base_of<SomeTag, T>::value>
struct MyClass { };

template<typename T>
struct MyClass<T, true> {
    typedef int isSpecialized;
};

int main() {
    MyClass<SomeTag>::isSpecialized test1;        /* ok */
    MyClass<InheritSomeTag>::isSpecialized test2; /* ok */
}

原文由 Carlo Wood 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题