我使用functional将函数指针传递给函数,并使用构造函数初始化将其保存在局部变量中以备将来使用。如何为参数指定默认值。
示例:
function<void()> BEGINFILE;
somefunct(function<void()> BEGINFILE): BEGINFILE(BEGINFILE) {}
但我似乎做不到:
void nullfunct() {}
function<void()> BEGINFILE;
void somefunct(function<void()> BEGINFILE = nullfunct): BEGINFILE(BEGINFILE) {}
或:
void nullfunct() {}
function<void()> BEGINFILE;
somefunct(function<void()> BEGINFILE) {
BEGINFILE = BEGINFILE;
}
我还读到C++17中弃用/删除了functional。我试图找到C++17的作用,但没有成功。
我假设somefunct
是class
(或struct
(,而
void somefunct(function<void()> BEGINFILE): BEGINfILE(BEGINFILE) {}
你是说somefunct
的构造函数吗。
第一个(次要的(问题:构造函数不返回值,所以删除初始的void
。
对于主要问题,我认为当默认函数(nullfunct()
(是非静态成员函数时,您会遇到问题。
我的意思是,在这种情况下
struct somefunct
{
void nullfunct() {}
std::function<void()> bf;
somefunct (std::function<void()> bf0 = nullfunct) : bf{bf0}
{ }
};
不幸的是,非静态成员函数很奇怪,与常规函数非常不同,并且不能将其分配给std::function
。
我认为有三种方法可以解决这个问题。
- 用
static
变换
static
成员函数不依赖于类的实例,因此它与常规函数的对象类型相同,可以分配给std::function
,因此如果可以在静态成员中转换nullfunct()
,则可以编写
struct somefunct
{
static void nullfunct() {}
std::function<void()> bf;
somefunct (std::function<void()> bf0 = nullfunct) : bf{bf0}
{ }
};
- 使
nullfunct()
成为一个正则函数
如果您可以使nullfunct()
成为一个正则函数(不是类或结构的成员(,它将与std::function
兼容,因此
void nullfunct() {}
struct somefunct
{
std::function<void()> bf;
somefunct (std::function<void()> bf0 = nullfunct) : bf{bf0}
{ }
};
- 用空函数初始化,并用包装lambda设置
如果不能在static
成员函数(方法1(或正则函数(方法2(中转换somefunct()
,则可以将对somefunct()
的调用封装在可以分配给std::function
的lambda函数中。
不幸的是,这个lambda函数必须捕获this
指针,如果它被定义为构造函数参数的默认值,则无法执行此操作,因此我看到的方法是用空的std::function
初始化std::function
,并且在构造函数的主体中,如果成员包含空函数,则分配lambda。
我是说
struct somefunct
{
void nullfunct() {}
std::function<void()> bf;
somefunct (std::function<void()> bf0 = {}) : bf{bf0}
{ if ( not bf ) bf = [this]{ this->nullfunct(); }; }
};