【问题标题】:Tuple of pointers to functions returning reference to variadic types指向函数的指针元组返回对可变参数类型的引用
【发布时间】:2014-09-25 17:05:57
【问题描述】:

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

我有这门课

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

【问题讨论】:

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


    【解决方案1】:

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

    1. 你的getter和setter是成员函数,所以你需要使用一个指向成员函数类型的指针:Types&amp;(test_class::*)()...; &amp;test_class::get&lt;Types&gt;...

    2. set 采用右值引用:void(test_class::*)(Types&amp;&amp;)...

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

    【讨论】:

    • 哦,右值引用部分是错字
    • 尝试创建类的实例并调用方法;它对我来说失败了:/
    • 嗯,我的代码肯定还是有问题。我只是从你的链接中复制粘贴代码,比试图找到错误更容易。
    猜你喜欢
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多