gpt4 book ai didi

c++ - 如何在带有CRTP模式的派生类中使用聚合初始化?

转载 作者:行者123 更新时间:2023-12-03 07:15:35 25 4
gpt4 key购买 nike

我使用的标准是c++17
问题是我想重新制作代码并使用CRPT重新组织代码结构,因为它非常适合,但问题是先前的代码在类之内使用了聚合初始化:

ClassWithNoParent get(const T_& unit) const {
return {.w = 1,
.h = 1,
.c = 1,
.n = 1};
}
很好当我使用CRTP时
class DefaultClass {
public:
int n;
int c;
int h;
int w;
};

template <class SuccessorT, class T = DefaultClass>
class BaseCRTPClass {
public:
int w;
int h;
int c;
int n;

SuccessorT get(const DefaultClass&) const {
return {.w = 1,
.h = 1,
.c = 1,
.n = 1};
}
};

class Successor : public BaseCRTPClass<Successor> {};

int main(){
Successor t;
auto k = t.get(DefaultClass{});
}
编译失败并显示错误
21:25: error: could not convert '{1, 1, 1, 1}' from '<brace-enclosed initializer list>' to 'Successor'
可以预期,因为standard希望 Successor进行聚合,但是我不太确定 c++17严格禁止没有基类。它限制了构造函数(据我了解,但我可能是错的)。那么,如何才能绕过此问题呢?
如何为CRTP定义的派生类保留聚合的初始化?
附言为什么要保留汇总的初始化?因为我代码中的许多地方都使用此初始化,但是如果要在CRTP中进行重新制作,那么所有内容都会被粉碎,并且我不得不替换某些构造函数上所有聚合的初始化...

最佳答案

该问题与CRTP无关。派生类的聚合初始化仅在C++ 17中引入。要聚合初始化派生类,必须在其自己的初始化程序列表中将基类初始化为第一项。因此,要使其正常工作,请使用双括号:

return {{.w = 1, .h = 1, .c = 1, .n = 1}};
为了说明这一点,假设您有一个更简单的非模板类:
struct Base { int a; };
struct Derived : public Base { int b; };
您必须将 Base初始化为第一项:
Derived x = { 
{ .a = 42 }, // Base
.b = 24 // b
};

关于c++ - 如何在带有CRTP模式的派生类中使用聚合初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64558184/

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