问题描述
我使用函数式将函数指针传递给函数,并使用构造函数初始化将其保存在局部变量中以备后用。如何为参数指定默认值。
示例:
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 中不推荐使用/删除了函数式。我试图找出 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
,因此如果您可以转换 { {1}} 在静态成员中,可以写
nullfunct()
- 使
struct somefunct { static void nullfunct() {} std::function<void()> bf; somefunct (std::function<void()> bf0 = nullfunct) : bf{bf0} { } };
成为常规函数。
如果您可以使 nullfunct()
成为常规(不是类或结构的成员)函数,则它与 nullfunct()
兼容,因此
std::function
- 用空函数初始化并用包装 lambda 设置
如果您无法在 void nullfunct() {}
struct somefunct
{
std::function<void()> bf;
somefunct (std::function<void()> bf0 = nullfunct) : bf{bf0}
{ }
};
成员函数(方式 1)或常规函数(方式 2)中转换 somefunct()
,您可以将 static
的调用包装在 lambda 中您可以分配给 somefunct()
的函数。
不幸的是,这个 lambda 函数必须捕获 std::function
指针,如果被定义为构造函数参数的默认值,那么我看到的方法是初始化 this
带有一个空的 std::function
,并且在构造函数的主体中,如果该成员包含一个空函数,则分配 lambda。
我是说
std::function