Упрощение спецификации класса шаблона - PullRequest
1 голос
/ 09 марта 2012

Меня очень интересуют возможности шаблонных классов. Теперь мне интересно, как я могу добиться следующего:

    Const<5>::getValue();

На данный момент я могу сделать это:

    Const<int, 5>::getValue());

И это реализация класса:

    template <typename T, T value>
    class Const {
    public:
        typedef T Type;

        static T getValue() {
            return value;
        }
    };

Я знаю, что это просто очень глупый пример, но как только я смогу это сделать, я мог бы упростить следующую строку:

    Getter<int, TestClass, &TestClass::get> getter;

просто:

    Getter<&TestClass::get> getter;

Это будет TestClass:

    class TestClass {
    private:
        int _value;
    public:
        int get() {
            return _value;
        }
    };

Спасибо за вашу помощь!

[РЕДАКТИРОВАТЬ-1]

Что касается J.N. да, C ++ 11 будет в порядке.

Что касается Xeo, я пытался использовать #define AUTO_ARG(x) decltype(x), x, но это не работает в TestClass.

[РЕДАКТИРОВАТЬ-2]

Что касается KennyTM, когда я объявляю Getter<...> g в TestClass, он не работает с Getter<AUTO_ARG(&TestClass::get)>, он работает только с Getter<int (TestClass::*)() const, &TestClass::get>.

Теперь мне интересно, это просто ошибка в Visual Studio ???

1 Ответ

2 голосов
/ 09 марта 2012

Вы все еще можете использовать AUTO_ARG(x), как указано @ Xeo's link .Если вам нужно получить возвращаемый тип или тип класса, просто используйте сопоставление с шаблоном (то есть специализация шаблона):

template <typename T, T mem_fun_ptr>
struct Getter;

template <typename R, typename C, typename... A, R (C::*mem_fun_ptr)(A...) const>
struct Getter<R (C::*)(A...) const, mem_fun_ptr>
{
    typedef R return_type;
    typedef C class_type;
};

#define AUTO_ARG(x) decltype(x),(x)

class TestClass {
private:
    int _value;
public:
    int get() const {
        return _value;
    }
};

Getter<AUTO_ARG(&TestClass::get)> g;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...