Получите имя класса из другого имени класса в шаблоне

Чтобы использовать библиотеку, мне нужно использовать разные классы с одинаковым базовым именем. Т.е.

MyClass
MyClassImpl
PreMyClass

И так далее. чтобы использовать их с шаблоном, мне нужно передать все эти имена классов.

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

Можно получить тот же результат, давая только основной MyClass в качестве аргумента шаблона, создавая другие имена при необходимости?

2 ответа

Решение

Я не уверен в настройках вашего вопроса, но в некоторых случаях вы можете захотеть сделать что-то вроде механизма черт.

Предположим, вы пишете конкретный 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;
};

Это позволяет вам объяснить, каковы "естественные друзья" ваших основных конкретных классов.

Я могу придумать два варианта:

  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. черты, но уже есть ответ на эту сторону:-)
Другие вопросы по тегам