Я изменяю класс, добавляя элемент данных с шаблоном. Код всегда будет использовать тип шаблона по умолчанию для параметра шаблона во всех вызовах, кроме одного места. Частично мотивировано этим, а частично из-за желания / прихоти, я не хочу добавлять параметр шаблона в класс, как показано ниже:
#include <iostream>
template <typename Der>
class A : private Der {
public:
int get() { return Der::get_(); }
};
class B {
protected:
int get_() { return 20; }
};
class C {
protected:
int get_() { return 30; }
};
using Default = B;
template <class T = Default>
class User {
public:
User() {}
A<T>& getMember() { return m_; }
private:
A<T> m_; // This is what I am adding, and exposing param T.
};
int main(int argc, char* argv[]) {
User h;
std::cout<<h.getMember().get()<<std::endl;
}
Одним из решений, которое я мог бы придумать, является использованиетипа sum, но здесь вводится некоторый код обработки исключений:
class User {
public:
User() : m_(A<Default>()) {}
template <typename T>
User(const T& in) : m_(in) {}
template <typename T>
A<T>& getMember() { return std::get<A<T>>(m_); }
private:
std::variant<A<B>, A<C>> m_;
};
Я ищу:
- Имя того, что я пытаюсь сделать, если оно существует.
- Способы, с помощью которых я могу достичь желаемого.