Получите имя класса из другого имени класса в шаблоне
Чтобы использовать библиотеку, мне нужно использовать разные классы с одинаковым базовым именем. Т.е.
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;
};
Это позволяет вам объяснить, каковы "естественные друзья" ваших основных конкретных классов.
Я могу придумать два варианта:
- Используйте тег, чтобы сделать разницу. Таким образом, вы бы, например,
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
Специализация шаблонов должна сделать их определение легким / возможным.
- черты, но уже есть ответ на эту сторону:-)