如何获得成员函数指针的元组?我似乎无法找到正确的语法。我认为这样可行:
template <typename... T>
auto getPushBackFunctionPointers() -> std::tuple<void(std::vector<T>::*)(T const&)...>
{
return std::make_tuple(&std::vector<T>::push_back...);
}
但它没有编译(GCC 4.8.2):
错误:函数'constexpr std :: tuple :: __ type ...&gt;的参数太多 std :: make_tuple(_Elements&amp;&amp; ...)[with _Elements = {}]' return std :: make_tuple(&amp; std :: vector :: push_back ...); ^
我通过引入这样的辅助函数找到了一种解决方法:
template <typename T>
auto getPushBackFunctionPointer() -> void(std::vector<T>::*)(T const&)
{
return &std::vector<T>::push_back;
}
template <typename... T>
auto getPushBackFunctionPointers() -> std::tuple<void(std::vector<T>::*)(T const&)...>
{
return std::make_tuple(getPushBackPointer<T>()...);
}
我能以某种方式在单一功能中完成这项工作吗?
答案 0 :(得分:2)
正如@dyp在评论中所指出的,存在过载选择的问题。您的解决方法有效,因为只有一个push_back
成员函数具有您想要的签名。您可以使用强制转换
template <typename... T>
auto getPushBackFunctionPointers() -> std::tuple<void(std::vector<T>::*)(T const&)...>
{
return std::make_tuple(static_cast<void(std::vector<T>::*)(T const&)>(&std::vector<T>::push_back)...);
}
就个人而言,我发现辅助函数在一种类型上运行更易读。
答案 1 :(得分:0)
以下作品:
#define Return(ret) decltype(ret) { return ret; }
template <typename... T>
auto getPushBackFunctionPointers()
-> Return(std::tuple<void (std::vector<T>::*)(T const&)...>(&std::vector<T>::push_back...))