指向返回对可变参数类型的引用的函数的指针元组

时间:2014-09-25 08:52:51

标签: c++ variadic-templates c++14 stdtuple

不要让问题标题吓跑你!我相信这只是一个语法问题。

我有这个班级

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()函数指针的元组。

1 个答案:

答案 0 :(得分:1)

您的省略号位于正确的位置,您只需要确保类型实际匹配。

  1. 您的getter和setter是成员函数,因此您需要使用指向成员函数类型的指针:Types&(test_class::*)()...; &test_class::get<Types>...

  2. set采用左值参考:void(test_class::*)(Types&&)...

  3. 结果代码;用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;
        }