在对空基类使用聚合初始化时如何避免 {}
How to avoid {} when using aggregate initialization with empty base class
>C++17 对基类的聚合初始化非常棒,但是当基类只提供一些函数(所以没有数据成员(时,它会很冗长。
下面是最小示例:
#include <cstddef>
struct base_pod
{
// functions like friend compare operator
};
template<typename T, std::size_t N>
struct der_pod : public base_pod
{
T k[N];
};
int main()
{
der_pod<int, 2> dp {{}, {3, 3} };
}
如上例所示,我必须提供空{}
,否则会发生编译错误。 现场演示。如果我省略它:
prog.cc:15:28: error: initializer for aggregate with no elements requires explicit braces
der_pod<int, 2> dp{3, 3};
^
prog.cc:15:31: warning: suggest braces around initialization of subobject [-Wmissing-braces]
der_pod<int, 2> dp{3, 3};
^
{}
1 warning and 1 error generated.
任何解决方法或 C++17 之前的方法?
您仍然可以提供构造函数,例如:
template <typename T, std::size_t N> using always_t = T;
struct base_pod
{
// functions like friend compare operator
};
template<typename T, typename Seq> struct der_pod_impl;
template<typename T, std::size_t ... Is>
struct der_pod_impl<T, std::index_sequence<Is...>> : base_pod
{
der_pod_impl(always_t<T, Is>... args) : k{args...} {}
T k[sizeof...(Is)];
};
template<typename T, std::size_t N>
using der_pod = der_pod_impl<T, std::make_index_sequence<N>>;
演示
相关文章:
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 轻松日志记录++如何避免多个初始化
- 有没有办法在初始化字符串时避免来自 clang-tidy(fuchsia-default-arguments)的警告?
- 避免在 c++ 向量或 valarray 中进行初始化
- 在类构造函数中初始化映射时,如何避免内存泄漏
- 在对空基类使用聚合初始化时如何避免 {}
- 避免由于标题中的专业初始化而避免重复的符号
- C 如何避免访问尚未初始化的对象的成员
- 我如何避免明确构建C 初始化列表中继承的所有内容
- 如何避免需要在初始化列表中初始化成员对象
- 如何避免两步初始化
- 是否有可能在初始化列表中避免使用static_cast
- 初始化QByTearray避免[-wnarrow]
- 如何避免丢失自动生成的初始化列表构造函数
- 在避免新分配的同时,const变量的复杂初始化
- 优雅地避免了未来C++向量元素的值初始化
- 来自非初始化变量的值从何而来
- 何时使用外部链接初始化全局常量,避免静态初始化顺序惨败
- c++ noob:初始化时避免冗余对象复制的正确方法
- 跳过显式模板初始化以避免双重初始化