从模板中的另一个类名派生类名

时间:2015-06-10 09:00:41

标签: c++ templates arguments class-names

为了使用库,我需要使用具有相同基本名称的不同类。即。

MyClass
MyClassImpl
PreMyClass

等等。为了将它们与模板一起使用,我需要传递所有这些类名。

template <typename T, typename TImpl, typename PreT>
class ClassThatUsesAllTheseObjects
{
  public:
  ClassThatUsesAllTheseObjects();
  private:
  T myClass;
  TImpl myClassImpl;
  PreT myPreClass;
};

可以获得相同的结果,只给出主MyClass作为模板参数,在需要时建立其他名称?

2 个答案:

答案 0 :(得分:1)

我不确定您问题中的设置,但在某些情况下,您可能希望执行类似trait mechanism的操作。

假设你写了一个具体的MyClass,其他人喜欢它。对于每组具体类,您可以执行以下操作:

// This is common
template <typename T>
struct foo_traits
{

};

// This is for each set of concrete classes
template<>
struct foo_traits<MyClass>
{
   using Impl = MyClassImpl;
   using Pre = PreMyClass; 
};

...

然后你使用这样的traits类:

template <
    typename T, 
    class Impl = typename foo_traits<T>::Impl,
    class Pre = typename foo_traits<T>::Pre>
class ClassThatUsesAllTheseObjects
{
  public:
  ClassThatUsesAllTheseObjects();
  private:
  T myClass;
  Impl myClassImpl;
  Pre myPreClass;
};

这可以让你解释什么是&#34;自然的朋友&#34;你的主要具体课程。

答案 1 :(得分:1)

我可以想到两个选择:

  1. 使用标签来发挥作用。所以你会有例如template <class T> myClassstruct impl_t{}, struct pre_t{}, struct base_t{},然后以这种方式使用gthem:
  2. 代码:

    myClass<base_t> ; // instead of plain MyClass
    myClass<impl_t> ;// instead of plain MyClassImpl
    myClass<pre_t> ; // instead of myPreClass
    

    模板专业化应该使他们的定义变得容易/可能。

    1. 特质,但这方面已有答案: - )