Кортеж указателей на функции, возвращающие ссылку на вариативные типы

Пусть вас не пугает название вопроса! Я считаю, что это просто вопрос синтаксиса.

у меня есть этот класс

template<typename ... Types>
class test_class{
    public:
        template<typename T>
        T &get(){return std::get<T>(m_values);}

        template<typename T>
        void set(T &&t){std::get<T>(m_values) = t;}

        // scary part
        std::pair<std::tuple</* trouble */ Types&(*)()...>, std::tuple<void(*)(Types)...>> &getters_setters(){
            static std::pair<std::tuple<Types&&(*)()...>, std::tuple<void(*)(Types)...>> ret{
                std::make_tuple(get<Types>...),
                std::make_tuple(set<Types>...)
            };
            return ret;
        }

    private:
        std::tuple<Types...> m_values;
};

И хотелось бы знать правильный синтаксис для расширения пакета параметров шаблона, чтобы я мог получить кортеж из T &get() указателей на функции.


person RamblingMad    schedule 25.09.2014    source источник


Ответы (1)


Ваши многоточия находятся в правильном месте, вам просто нужно убедиться, что типы действительно совпадают.

  1. Ваши геттеры и сеттеры являются функциями-членами, поэтому вам нужно использовать указатель на тип функции-члена: Types&(test_class::*)()...; &test_class::get<Types>...

  2. set принимает ссылку rvalue: void(test_class::*)(Types&&)...

Результирующий код; отлично компилируется с gcc 4.9.1:

    std::pair<std::tuple<Types&(test_class::*)()...>,
            std::tuple<void(test_class::*)(Types&&)...>>&
    getters_setters()
    {
        static std::pair<std::tuple<Types&(test_class::*)()...>,
                std::tuple<void(test_class::*)(Types&&)...>> ret{
            std::make_tuple(&test_class::get<Types>...),
            std::make_tuple(&test_class::set<Types>...)
        };
        return ret;
    }
person ecatmur    schedule 25.09.2014
comment
О, часть ссылки на rvalue была опечаткой - person RamblingMad; 25.09.2014
comment
Попробуйте создать экземпляр класса и вызвать метод; у меня не получается :/ - person RamblingMad; 25.09.2014
comment
Хм, должно быть, что-то не так с моим кодом. Я просто скопирую код с вашей ссылки, это проще, чем пытаться найти ошибку. - person RamblingMad; 25.09.2014