Специализируйте тип возвращаемого значения метода шаблона по строковому параметру шаблона

По чисто косметическим причинам (т. е. чтобы сделать 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++.

0 ответов

Другие вопросы по тегам