如何为 <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 中不推荐使用/删除函数式。我试图找出 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

我看到了解决这个问题的三种方法。

  1. 将其转换为 static 一个

static 成员函数不依赖于类的实例,因此与常规函数的对象类型相同,可以分配给 std::function,因此如果您可以转换 { {1}} 在静态成员中,可以写

nullfunct()
  1. 使 struct somefunct { static void nullfunct() {} std::function<void()> bf; somefunct (std::function<void()> bf0 = nullfunct) : bf{bf0} { } }; 成为常规函数。

如果您可以使 nullfunct() 成为常规(不是类或结构的成员)函数,则它与 nullfunct() 兼容,因此

std::function
  1. 用空函数初始化并用包装 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