在可变模板函数中创建成员函数指针元组
Make tuple of member function pointers in variadic template function
如何获得成员函数指针的元组?我似乎找不到正确的语法。我想这会有用:
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...))
相关文章:
- 通过构造函数创建的所有对象都具有相同的向量
- 通过构造函数创建一些值并尝试添加到文档中使用 rapidjson 不起作用
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- C++ :: 如何捕获由 void 函数创建的矩阵
- 通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
- 用于基于成员字段或函数创建比较器的快捷方式
- std::使用类成员函数创建线程 - 最佳实践
- 为C++重载函数创建SWIG类型映射
- 使用成员函数创建std::函数不会编译
- 如何为返回特定类型的函数创建 SWIG 类型图
- 为具有多个参数的函数创建 SWIG 类型图的更简单方法?
- 通过另一个宏创建的函数创建所有列表的宏
- std::map<int, A> 运算符 [] 需要使用空构造函数创建 A
- 无法使用 CreateWindowEx 函数创建窗口
- c++ 从成员函数创建新线程并移动对象和整个对象
- 无法使用 c++ 中的类成员函数创建/写入文件
- 使用makeword函数创建错误e0109-表观呼叫的括号前表达式必须具有(指针到 - )函数类型
- 为 OpenMP 函数创建别名 ||部分禁用 openMP
- 稍后使用<Class>调用类构造函数创建 std::vector