Как избежать {} при использовании агрегатной инициализации с пустым базовым классом - PullRequest
7 голосов
/ 09 апреля 2019

Агрегатная инициализация 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?

1 Ответ

2 голосов
/ 09 апреля 2019

Вы все еще можете предоставить конструктор, например:

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>>;

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...