1

如何获得成员函数指针的元组?我似乎找不到正确的语法。我认为这会起作用:

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 ...> std::make_tuple(_Elements&& ...) [with _Elements = {}] 的参数太多返回 std::make_tuple(&std::vector::推回...); ^

我通过引入这样的辅助函数找到了一种解决方法:

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

我可以以某种方式在单个函数中执行此操作吗?

4

2 回答 2

2

正如@dyp 在评论中指出的那样,存在重载选择的问题。您的解决方法有效,因为只有 1push_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)...);
    }

就个人而言,我发现在一种类型上运行的辅助函数更具可读性。

于 2014-05-21T16:57:06.823 回答
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...))
于 2014-05-21T16:56:17.597 回答