Я хочу иметь класс Boxed_value
, который может InBox
других типов (начиная с int
, double
, string
...), аналогично object
в C#
. Этот тип класса может быть далее передан функциям, которые Unbox
it. Эти функции получат ссылку:
void receiver( Boxed_value & bv ) {}
Итак, это не должен быть шаблон. Или же? Мне нужен рецепт ... Функция UnBox
может быть отдельной и шаблонной. В этом случае receiver
может получить 2 параметра:
void receiver( Boxed_value & bv, Engine & eng ) {}
Реализация ниже является фиктивной и не компилируется.
struct Boxed_value {
void inbox(int v) { _iv = v; }
void inbox(double v) { _dv = v; }
void inbox(std::string & v) { _sv = v; }
int _iv;
double _dv;
std::string _sv;
};
struct Engine {
template<typename T>
T unbox(Boxed_value bv) {
if (std::is_same<T, typeid(bv._iv).name()>::value) { return _iv };
if (std::is_same<T, typeid(bv._dv).name()>::value) { return _dv };
if (std::is_same<T, typeid(bv._sv).name()>::value) { return _sv };
}
};