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

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

MyClass
MyClassImpl
PreMyClass

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

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

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

0

Решение

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

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

Другие решения

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

  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. черты, но уже есть ответ на эту сторону 🙂
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector