gpt4 book ai didi

c++ - 如何在需要提及需要循环声明的其他类的类中初始化变量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:50:12 25 4
gpt4 key购买 nike

在下面的示例中,struct Y 前向声明的前向声明是不够的。如果你注释掉 X::b,它编译得很好,因为 Y 有一个完整的结构声明可以使用,但 X 只有前向声明。

#include <functional>
#include <iostream>

struct Y;

struct X
{
std::function<bool(Y&)> b{[] (auto& y_) { return y_.a; }};

bool a{false};
};

struct Y
{
std::function<bool(X&)> b{[] (auto& x_) { return x_.a; }};

bool a{true};
};

int main()
{
return 0;
}

Ideone

以下是我可以想出的修复方法:

#include <functional>
#include <iostream>

struct Y;

struct X
{
X();
std::function<bool(Y&)> b;

bool a{false};
};

struct Y
{
Y();
std::function<bool(X&)> b{[] (auto& x_) { return x_.a; }};

bool a{true};
};

X::X() : b([] (auto& y_) { return y_.a; }) {}
Y::Y() : b([] (auto& x_) { return x_.a; }) {}

int main()
{
return 0;
}

Ideone

虽然它在这个例子中有效,但如果类是多态的,这将需要 using X::X;using Y::Y;分别是那些类。

有没有办法在头文件中做到这一点?

最佳答案

你可以这样做:

#include <functional>

template <typename T> bool (*get_lambda())(T&) {return [] (auto& y_) { return y_.a; };};

struct Y;

struct X
{
std::function<bool(Y&)> b{get_lambda<Y>()};

bool a{false};
};

struct Y
{
std::function<bool(X&)> b{get_lambda<X>()};

bool a{true};
};

int main()
{
return 0;
}

关于c++ - 如何在需要提及需要循环声明的其他类的类中初始化变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45513565/

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