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

Posted

技术标签:

【中文标题】从模板中的另一个类名派生一个类名【英文标题】:Derive a class name from another class name in template 【发布时间】:2015-08-25 10:23:41 【问题描述】:

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

MyClass
MyClassImpl
PreMyClass

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

template <typename T, typename TImpl, typename PreT>
class ClassThatUsesAllTheseObjects

  public:
  ClassThatUsesAllTheseObjects();
  private:
  T myClass;
  TImpl myClassImpl;
  PreT myPreClass;
;

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

【问题讨论】:

预处理器用于此。 【参考方案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; 
;

...

然后你像这样使用特征类:

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;
;

这使您可以解释您的主要具体类的“天然朋友”是什么。

【讨论】:

谢谢,这正是我所需要的。【参考方案2】:

我能想到两个选择:

    使用标签来做出改变。所以你会有例如一个template &lt;class T&gt; myClass,一个struct impl_t, struct pre_t, struct base_t,然后以这种方式使用gthem:

代码:

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

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

    特质,但那边已经有答案了:-)

【讨论】:

标签是一个不错的解决方案,但我更喜欢特质,因为我无法修改这些类。但这也是个好主意。

以上是关于从模板中的另一个类名派生一个类名的主要内容,如果未能解决你的问题,请参考以下文章

获取 DisplayNameAttribute 派生类中的属性和类名

如何将类名作为变量传递给ruby中的另一个类

控制器名称是从类名派生的吗?

CSS 显示模板类名中的额外空格

3.继承与派生

多继承的构造和析构函数调用顺序