c++ - 函数采用指向方法的指针,而不考虑 constness
问题描述
我想实现一个通用函数,它将引用对象和指向其成员函数的指针并调用它。但是,当我的类同时具有 const 和非 const 方法时,我无法这样做,因为我需要提供两个重载:
template<typename Ret, typename Class, typename ...Us>
Ret callMethod(Class &object, Ret (Class::*method)(Us...))
{
return (object.*method)(Us{}...);
}
template<typename Ret, typename Class, typename ...Us>
Ret callMethod(Class &object, Ret (Class::*method)(Us...) const)
{
return (object.*method)(Us{}...);
}
有什么方法可以只编写 1 个模板函数来接受 const 和非 const 方法指针,这样我就不必编写两次代码了?我正在使用 C++14。
从更广泛的角度来看,我最终想要实现的是传递第三个参数,一个数据缓冲区,将从中提取方法参数 - 因此模板函数尽可能通用地处理它。
解决方案
简短的回答是,不要自己实现,它已经以以下形式为您完成std::invoke
:
#include <functional>
struct A {
void foo(int x);
void bar(int x) const;
};
void example() {
A a;
std::invoke(&A::foo, a, 3);
std::invoke(&A::bar, a, 3);
}
回想起来,您已经添加了一个 C++14 标记,文档中std::invoke
有一个示例实现,您可以在您的项目中使用它。
推荐阅读
- ocaml - 整体运行语句时出错,但在顶层逐个运行时工作
- java - 将 ComboPooledDataSource 与 Postgres 一起使用时,c3p0 抛出 com.mchange.v2.resourcepool.CannotAcquireResourceException
- sql - WITH 子句:仅包括每个表中的某些值
- android - 我无法播放 m3u8 格式的视频
- laravel - 在创建时验证 laravel 中的重叠日期
- oracle-coherence - 连贯性错误我在 oracle 连贯性中遇到错误,例如“无法将类型 -28 转换为集合类型
- docker - 在 Docker 容器中访问 Redis CLI
- python - 使用 openpyxl 对 XLSX 工作簿中的选项卡进行排序
- google-translate - 谷歌翻译小部件是免费或付费功能 googleTranslateElementInit()
- r - 控制 R igraph 中节点和边的绘制顺序?