gpt4 book ai didi

c++ - 一种存储函数及其(任意类型,任意数量)参数的简洁方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:58 25 4
gpt4 key购买 nike

对于一个库,我希望一个函数接受另一个函数及其参数,然后将它们全部存储起来以备后用。参数必须允许任何类型的混合,但函数只需要返回 void。像这样:

void myFunc1(int arg1, float arg2);
void myFunc2(const char *arg1);
class DelayedCaller
{ ...
public:
static DelayedCaller *setup(Function func, …);
};

...
DelayedCaller* caller1 = DelayedCaller::setup(&myFunc1, 123, 45.6);
DelayedCaller* caller2 = DelayedCaller::setup(&myFunc2, "A string");

caller1->call(); // Calls myFunc1(), with arguments 123 and 45.6
caller2->call(); // Calls myFunc2(), with argument "A string"

一种方法是让 DelayedCaller::setup() 接受 std::function,并让我的库用户在调用 setup() 之前使用 std::bind()。但是,有没有一种方法可以实现 setup() 以便用户不需要自己进行绑定(bind)?

编辑:DelayedCaller 是一个现有类。 setup() 是我想添加的新静态方法。

最佳答案

一种可能性是使用可变参数模板并调用 std::bind()setup() 函数中:

#include <iostream>
#include <string>
#include <functional>
#include <memory>

void myFunc1(int arg1, float arg2)
{
std::cout << arg1 << ", " << arg2 << '\n';
}
void myFunc2(const char *arg1)
{
std::cout << arg1 << '\n';
}

class DelayedCaller
{
public:
template <typename TFunction, typename... TArgs>
static std::unique_ptr<DelayedCaller> setup(TFunction&& a_func,
TArgs&&... a_args)
{
return std::unique_ptr<DelayedCaller>(new DelayedCaller(
std::bind(std::forward<TFunction>(a_func),
std::forward<TArgs>(a_args)...)));
}
void call() const { func_(); }

private:
using func_type = std::function<void()>;
DelayedCaller(func_type&& a_ft) : func_(std::forward<func_type>(a_ft)) {}
func_type func_;
};

int main()
{
auto caller1(DelayedCaller::setup(&myFunc1, 123, 45.6));
auto caller2(DelayedCaller::setup(&myFunc2, "A string"));

caller1->call();
caller2->call();

return 0;
}

输出:

123, 45.6A string

返回一个智能指针,比如std::unique_ptr ,而不是返回原始指针(或按值返回并避免动态分配。如果参数是可移动的,则 func_type 是可移动的,或者无论如何复制它可能非常便宜。您可能需要定义移动构造函数和移动赋值运算符,它们是在特定条件下生成的)。

关于c++ - 一种存储函数及其(任意类型,任意数量)参数的简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14833129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com