gpt4 book ai didi

c++ - 使用 std::function 初始化匿名类成员变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:13:02 24 4
gpt4 key购买 nike

我想知道是否有解决方法是这样的:

class A
{
class
{
public:
void setValue(int val) {i=val;}
private:
int i;
} B = initB(10);

std::function<decltype(B)(int)> initB = [this](int value)
{decltype(B) temp;
temp.setValue(value);
return temp;};
}


//...
A a; //crash
//...

我想这是由初始化顺序引起的。变量 B 是通过调用未初始化的 std::function 实例初始化的,因此发生了崩溃。按照我的逻辑,解决方法是先初始化 std::function,然后初始化成员 B。但是,这样的代码是无效的:

class A
{
//error: 'B' was not declared in this scope
std::function<decltype(B)(int)> initB = [this](int value)
{decltype(B) temp;
temp.setValue(value);
return temp;};
class
{
public:
void setValue(int val) {i=val;}
private:
int i;
} B = initB(10);
}

我试图使 std::function static,这样的代码有效,但需要 non-constexpr/const 成员,因为 std::function 有 non-trivial destructor - 这很糟糕,因为这需要源文件,这需要创建这样的文件,这需要一些努力和破坏我美丽的仅 header 类层次结构! (我的意思是,我可以偷懒并在 header 中定义此变量,但随后会出现多重定义问题)。我知道这可能是一个糟糕的设计(我只是在测试),但是您知道如何在不涉及源文件的情况下解决问题吗?

最佳答案

虽然您的示例是人为设计的,但有时我需要(或更方便地)以类似方式初始化复杂对象。

但是,为什么要使用 std::function<>?为什么不只使用一个函数?

class A
{
class
{
public:
void setValue(int val) { i = val; }
private:
int i;
} B = initB(10);

static decltype(B) initB(int value)
{
decltype(B) temp;
temp.setValue(value);
return temp;
}
};

虽然,我通常不会使用 decltype(B);我只想给类(class)起个名字。

关于c++ - 使用 std::function 初始化匿名类成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37864346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com