c++ - 在 C++ 中的数据成员中存储带有变量参数的函数引用
问题描述
我想在类数据成员中存储具有可变数量参数的函数引用,然后按如下方式调用它:
auto my_action = new ExecuteAction("Add", add, 1, 2);
std::vector<ExecuteAction *> execute_actions;
execute_actions.push_back(my_action);
// ...
auto my_action_retrieved = execute_actions.at(0);
my_action_retrieved->execute();
请注意,add()
例如定义如下:
void add(int a, int b) {
std::cout << a + b << std::endl;
}
到目前为止,我能得到的最接近的解决方案如下:
template<typename Function, typename... Arguments>
class ExecuteAction {
static_assert(!(std::is_rvalue_reference_v<Arguments> && ...));
std::string option_name;
Function function;
std::tuple<Arguments...> arguments;
public:
template<typename ForwardFunction, typename... ForwardArguments,
typename = std::enable_if_t<(std::is_convertible_v<ForwardArguments &&, Arguments> && ...)>>
explicit ExecuteAction(std::string &option_name,
ForwardFunction &&function,
ForwardArguments &&... arguments)
: function(std::forward<ForwardFunction>(function)),
arguments{std::forward<ForwardArguments>(arguments)...} {
this->option_name = option_name;
}
void execute() {
std::apply(function, arguments);
}
};
template<typename Function, typename... Arguments>
auto make_execute_action(std::string option_name, Function &&function, Arguments &&... arguments) {
return new ExecuteAction<std::decay_t<Function>, std::remove_cv_t<std::remove_reference_t<Arguments>>...>
(option_name, std::forward<Function>(function), std::forward<Arguments>(arguments)...);
}
这段代码可以成功调用如下:
auto add_action = make_execute_action("Add", [](int a, int b) {
std::cout << a + b << std::endl;
}, 1, 2);
add_action->execute();
然而,该解决方案存在以下问题:
- 函数必须由 lambda 表达式传递,但我想传递函数引用(如上面的示例)
- 使用泛型
std::vector
似乎不可能,因为需要专门定义模板参数
C
是否有C++20
满足我要求的实现?
解决方案
推荐阅读
- mysql - 如何拆分字符串以显示在 MySQL 的不同列中
- wso2 - WSO2 api 管理器 - API 状态更改工作流 - 错误 - 既不在同一进程中也不在父进程中 errorCode='REST_CLIENT_INVOKE_ERROR')
- symfony - Symfony 4 SwiftMailer 不发送电子邮件
- android - 如何使用 apache OpenNLP 解决 IllegalStateException 和 ParserConfigurationException 以在 android studio 中查找位置
- android - 当键盘出现 API 26(Samsung S8)时,Android Popupwindow 不会在正确的位置更新
- html - 使用较少的不透明度增加的背景颜色
- angular - 角度表单值将父表单数组页面设置为子表单数组页面
- java - 布冯针模拟
- mysql - 来自同一基础表的两个 GROUP BY 子查询的列总和
- oracle - 员工供应商名称海量更新-融合采购云