[英]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>>;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.