Специализируйте тип возвращаемого значения метода шаблона по строковому параметру шаблона
По чисто косметическим причинам (т. е. чтобы сделать C++ API более похожим на тот же API для языков с динамической типизацией) у меня есть несколько классов:
namespace O {
class A {
public:
void foo() {
std::cout << "foo" << std::endl;
}
};
class B {
public:
void bar() {
std::cout << "bar" << std::endl;
}
};
};
и я хотел бы иметь еще один класс
X
, с методом для каждого из вышеперечисленных классов, который возвращает существующий экземпляр, то есть:
X x;
auto a = x.getObject<"A">();
a.foo();
auto b = x.getObject<"B">();
b.bar();
return 0;
не уверен, как написать и специализировать шаблон
getObject
... Я подозреваю, что это будет слишком сложно по сравнению с простым наличием методов
A& getObjectA();
а также
B& getObjectB();
и семантически почти то же самое ... так что, возможно, это похоже на одну из тех вещей, что «вы делаете это неправильно».
Я пробовал что-то вроде этого, но у него есть несколько ошибок:
class X {
public:
template<const char *N, class T>
T& getObject();
private:
O::A a;
O::B b;
};
template<>
O::A& X::getObject<"A", O::A>() {
return a;
}
template<>
O::B& X::getObject<"B", O::B>() {
return b;
}
Я надеюсь, что вопрос достаточно общего интереса.
Целевой язык — любой, предпочтительно C++11 для максимальной совместимости, но было бы неплохо посмотреть, как ситуация улучшится, приняв более свежие стандарты C++.