如何分配给 std::function<bool(wxString&)> 类型的成员

How do I assign to member of type std::function<bool(wxString&)>

我有一个自定义对话框 class(派生自 wxDialog)。我想添加一个 setter,这样您就可以使用类型为 std::function 的某些函数来设置回调函数 MyDialog::m_f。 稍后,对话框将调用此函数。 我希望能够传入一个 lambda 函数(否则我可以用普通的函数指针解决我的问题)。 还必须可以多次调用此 setter,m_f 的最后一个设置值应该有效,从而擦除任何以前的设置值(该值是一个新函数)。 但是,如果我声明成员 m_f,它是否必须在构造函数的初始化列表中初始化? 对于我的用例,这不会真正起作用。我必须能够设置 MyDialog::m_f 对话框构建之后(但在调用 ShowModal 之前)。

我的成员 m_f 是否应该是指向 std::function 的(唯一)指针,以便它可以在 MyDialog::MyDialog 中设置为 nullptr?

我的基本问题是我不完全理解std::function。你如何创建一个 std::function<...> 类型的变量并稍后为其赋值(具体函数)?有一个像描述的那样未初始化的变量是什么意思?我如何测试它是否已(未)分配?是否有可能延迟此赋值,即:有一个单独的声明和稍后的初始化,或者 std::function<...> 的变量是否应该立即初始化(如 const 或引用)?

感谢您的帮助。

顺便说一句,语言是C++11,由于工作限制无法升级

How can you make a variable of some std::function<...> type and assign a value (concrete function) to it later?

std::function 有一个导致“空”实例的默认构造函数。在您的情况下,只需声明数据成员 std::function<...> m_f 而不要显式初始化它。

What does it mean to have a variable like described which is uninitialized?

这取决于变量的类型。在std::function,简直不能用。如果您尝试创建一个空 std::function,将抛出异常。

How can I test whether it is (un)assigned?

std::function 有一个 explicitbool 的转换运算符。当对象非空时,它的计算结果为 true,即

if (m_f)
  m_f(/* parameters... */);
else
  ; // do nothing, not set yet

How can you make a variable of some std::function<...> type and assign a value (concrete function) to it later?

如果以后想通过一个setter将lambda表达式赋值给函数对象,可以把这个成员函数变成模板,例如

template<class Fct>
void setCallback(Fct&& f)
{
    m_f = std::forward<Fct>(f);
}

另一种选择是将具有所需签名的 std::function 传递给非模板成员函数。