Как я могу сохранить список инициализаторов POD-структур после добавления общего предка?

#c

#c

Вопрос:

Я унаследовал некоторый код, который использует серию POD-структур, и хотел бы предоставить им всем общий базовый класс, чтобы я мог хранить их в общей системе.

Я должен упомянуть, что эти структуры используются в качестве классов взаимодействия с C #, поэтому мне нужно сохранить их свойства POD и aggregate.

Так довольно просто, например, ранее

 struct A {
   char *id;
   float *matrix;
}
struct B {
   char *id;
   int some_property;
}
 

В настоящее время часто используются списки инициализаторов во всем коде:

 B myB{ otherthing.id, otherthing.property };
 

и я хочу сделать их все Base :

 struct Base {
};

struct A : public Base {
   char *id;
   float *matrix;
}
struct B : public Base {
   char *id;
   int some_property;
}
 

что теперь нарушает поведение списка инициализаторов. Есть ли способ сохранить текущий код инициализации?

Комментарии:

1. Вероятно, самым простым решением было бы перейти на C 17, который позволяет агрегировать с базовыми классами. Если нет, я полагаю, вы могли бы заставить его работать с C 14, добавив как конструктор по умолчанию, так и конструктор с параметрами для инициализации. Или то же самое в C 11, если Base пусто, как в примере, который вы показываете. Но я не чувствую себя достаточно компетентным, чтобы ответить на этот вопрос, извините.

2. Я использую C 17, но приведенный выше пример списка инициализаторов не компилируется, поскольку он пытается преобразовать a char* в a Base .

3. Хм, своеобразно. Похоже, что вам нужно B myB{ {}, otherthing.id, otherthing.property }; инициализировать Base (или, по крайней мере, GCC с радостью принимает его в этой форме). Поэтому я предполагаю, что вам нужны эти конструкторы, чтобы заставить его работать без изменения инициализации. Классы не будут агрегатами, но все равно будут POD. wandbox.org/permlink/IWLTACHv7x25FAZx