不要让问题标题吓跑你!我相信这只是一个语法问题。
我有这门课
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()
函数指针的元组。
最佳答案
您的省略号在正确的位置,您只需要确保类型实际匹配即可。
您的 getter 和 setter 是成员函数,因此您需要使用指向成员函数类型的指针:
Types&(test_class::*)()...
;&test_class::get<Types>...
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/