在可变参数模板函数中创建成员函数指针的元组

时间:2014-05-21 16:37:01

标签: c++ c++11 variadic-templates member-function-pointers stdtuple

如何获得成员函数指针的元组?我似乎无法找到正确的语法。我认为这样可行:

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>()...);
}

我能以某种方式在单一功能中完成这项工作吗?

2 个答案:

答案 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...))