Есть ли способ указать на конструктор из std::map? Я хотел бы сделать следующее с кодом, который я хочу использовать в #if 0
, но я не могу заставить это работать:
#include <map>
#include <functional>
using namespace std;
class Base { };
class A : public Base { };
class B : public Base { };
enum class Type { A, B, };
#if 0
using type_map_t = std::map<Type, std::function<Base*()>>;
type_map_t type_map = {
{Type::A, &A::A},
{Type::B, &B::B},
};
#endif
Base*
getBase(Type t)
{
#if 0
auto constructor = type_map[t];
return constructor();
#else
switch(t)
{
case Type::A:
return new A();
case Type::B:
return new B();
}
#endif
}
int
main(int argc, char *argv[])
{
Base *base = getBase(Type::A);
return 0;
}
Вместо оператора switch в getBase я бы предпочел, чтобы карта указывала, какой конструктор вызывается для каждого типа.
std::function приходит на ум, как это сделать, но не представляется возможным получить адрес конструктора в C++. Есть ли элегантный способ выполнить то, что я хочу сделать здесь?