Я хочу сделать что-то подобное в C++ 11, но я не знаю, как это сделать или что делать с Google: Целью этого является эмулировать полиморфизм по типу возврата здесь, это образец код, чтобы объяснить, что я хочу сделатьC++ 11 template specialization wrapper
enum foo : int
{
bar = 1,
baz = 2
};
class Common
{
public:
Common(){}
~Common(){}
foo _val;
};
class A : public Common
{
A() :_val(foo::bar){}
virtual ~A(){}
int func(){return 0;}
};
class B : public Common
{
B() :_val(foo::baz){}
~B(){}
double func(){return 60.55;}
};
template <foo V>
auto wrapper(Common * val)
{
return wrapper<V>(val);
}
template <foo::bar>
A * wrapper(Common * val)
{
return (A*)val;
}
template <foo::baz>
A * wrapper(Common * val)
{
return (B*)val;
}
void leFunc(Common * t)
{
auto val = wrapper<t::_val>(&t)->func();
}
int main()
{
std::list<Common *> lst = {new A, new B};
for (auto & e : lst)
leFunc(e);
}
редактировать: некоторые реальный пример того, что я хочу сделать: идея заключается в том, чтобы звонить, как это:
int i = wrapper<1>(myInterface &);
double k = wrapper<2>(myInterface &);
std::list<float> i = wrapper<3>(myInterface &);
с специализацией шаблона хранящейся в интерфейсе (значение) Редактировать, если быть точнее
Хорошо, я вижу, поэтому вы просто хотите, чтобы карта отображала 0-> ints, 1-> double и т. Д. Таким образом вы передаете значение в оболочку и возвращает другое возвращаемое значение? Можете ли вы просто использовать boost :: any как возвращаемый тип для виртуального funtion? – dchhetri