gpt4 book ai didi

c++ - 我应该如何定义带有默认参数的 std::function 变量?

转载 作者:行者123 更新时间:2023-12-02 19:33:09 25 4
gpt4 key购买 nike

要将 std::function 变量设置为具有默认参数的 lambda 函数,我可以使用 auto ,如下所示:

auto foo = [](int x = 10){cout << x << endl;};
foo();

这将打印 10。

但我希望 foo 变量驻留在结构中。在结构中我无法使用 auto

struct Bar
{
auto foo = [](int x = 10}(cout << x << endl}; //error: non-static data member declared ‘auto’
};
Bar bar;
bar.foo();

用 std::function 替换 auto

struct Bar
{
std::function<void(int x = 10)> foo = [](int x = 10}(cout << x << endl}; //error: default arguments are only permitted for function parameters
};
Bar bar;
bar.foo();

struct Bar
{
std::function<void(int)> foo = [](int x = 10}(cout << x << endl};
};
Bar bar;
bar.foo(); //error: no match for call to ‘(std::function<void(int)>) ()’

没有结构并用 std::function 替换 auto:

std::function<void(int x)> foo = [](int x = 10){cout << x << endl;};
foo(); //error: no match for call to ‘(std::function<void(int)>) ()’

那么我应该如何声明 foo 呢?

最佳答案

std::function 中的签名基于您计划如何调用它,而不是基于您如何构造/分配它。由于您想以两种不同的方式调用它,因此需要存储到不同的 std::function 对象,如下所示:

struct Call
{
template<typename F>
explicit Call(F f) : zero_(f), one_(std::move(f)) {}

void operator()() { zero_(); }
void operator()(int i) { one_(i); }

std::function<void()> zero_;
std::function<void(int)> one_;
};

或者,您可以自己执行类型删除(std::function 在幕后执行的操作)以仅存储 lambda 一次,如下所示:

class TECall
{
struct Concept
{
Concept() = default;
Concept(Concept const&) = default;
virtual ~Concept() = default;

virtual Concept* clone() const = 0;

virtual void operator()() = 0;
virtual void operator()(int) = 0;
};

template<typename T>
struct Model final : Concept
{
explicit Model(T t) : data(std::move(t)) {}
Model* clone() const override { return new Model(*this); }

void operator()() override { data(); }
void operator()(int i) override { data(i); }

T data;
};

std::unique_ptr<Concept> object;

public:
template<typename F>
TECall(F f) : object(new Model<F>(std::move(f))) {}

TECall(TECall const& that) : object(that.object ? that.object->clone() : nullptr) {}
TECall(TECall&& that) = default;
TECall& operator=(TECall that) { object = std::move(that.object); return *this; }

void operator()() { (*object)(); }
void operator()(int i) { (*object)(i); }
};

关于c++ - 我应该如何定义带有默认参数的 std::function 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22916784/

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