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

Derive a class name from another class name in template

本文关键字:派生 另一个      更新时间:2023-10-16

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

MyClass
MyClassImpl
PreMyClass

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

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

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

我不确定问题中的设置,但在某些情况下,您可能想做一些类似特质机制的事情。

假设你写了一个具体的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;
};

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

我可以想到两个选项:

  1. 使用标记来区分。所以你会有例如一个template <class T> 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

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

  1. 特征,但那边已经有一个答案:-)
相关文章: