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

Make tuple of member function pointers in variadic template function

本文关键字:函数 创建 成员 指针 元组      更新时间:2023-10-16

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

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

我可以在一个函数中做这个吗?

正如@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)...);
    }

以下作品:

#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...))