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

标签 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. 您的 getter 和 setter 是成员函数,因此您需要使用指向成员函数类型的指针:Types&(test_class::*)()... ; &test_class::get<Types>...

  2. set采用右值引用: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;
    }

关于c++ - 指向函数的指针元组返回对可变类型的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26034332/

相关文章:

c++ - 给定大小 N 和类型 T 生成元组的函数

c++ - 精度损失

c++ - `std::unique_ptr` 的(不同的)助手

c++ - 为什么在未计算的操作数中不允许使用 lambda 表达式,但在常量表达式的未计算部分中允许使用 lambda 表达式?

c++ - 在 GitHub 中,如何在 "RecoverCompact"中搜索 "CPubKey::RecoverCompact"

c++ - 何时使用 C++ forward_list

c++ - 错误在哪里,为什么这个程序是错误的?

c++ - Eigen::RowVector 迭代器

c++ - 模板化方法指针 - 无法匹配函数参数的指针

c++ - 参数包展开顺序