如何为对象分配默认值<functional>?



我使用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的作用,但没有成功。

我假设somefunctclass(或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,因此如果可以在静态成员中转换nullfunct(),则可以编写

struct somefunct
{
static void nullfunct() {}
std::function<void()> bf;
somefunct (std::function<void()> bf0 = nullfunct) : bf{bf0}
{ }
};
  1. 使nullfunct()成为一个正则函数

如果您可以使nullfunct()成为一个正则函数(不是类或结构的成员(,它将与std::function兼容,因此

void nullfunct() {}
struct somefunct
{
std::function<void()> bf;
somefunct (std::function<void()> bf0 = nullfunct) : bf{bf0}
{ }
};
  1. 用空函数初始化,并用包装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(); }; }
};

最新更新