Скажем, класс Base
со следующими ресурсами:
struct Base
{
int m_int;
bool m_flag;
float m_float;
Base() = delete; // just to see that it didn't call
Base(int a, bool b, float c): m_int(a), m_flag(b), m_float(c) {}
};
Тогда у меня есть SubClass
, у которого вектор класса Base
является ресурсом.
- После исследования я обнаружил, что с помощью идеальной ссылки пересылки или пересылки ресурсы класса
Base
могут создаваться намного эффективнее, поскольку это позволяет избежать ненужного вызова конструкторов по умолчанию (пожалуйста, исправьте меня, если я ошибаюсь). - В дополнение к технике пересылки я хотел также иметь конструктор списка инициализаторов, чтобы можно было использовать агрегирование для
SubClass
Затем я подошелсо следующим кодом для моего SubClass
.
struct SubClass
{
private:
std::vector<Base> vec;
public:
SubClass() = delete; // just to see that it didn't call
// Idea - 1
//SubClass(std::initializer_list<Base>&& all): vec(std::move(all)) {}
// Idea - 2
SubClass(std::initializer_list<Base> all): vec(all) {}
// Idea - 3 : but no more list initialization possible
template<typename ...Arg>
void addToClass(Arg&& ...args)
{
vec.emplace_back(std::forward<Arg>(args)...);
}
};
Затем в main()
я могу иметь следующие две возможности для обновления ресурсов в SubClass
:
int main()
{
// possibility - 1
SubClass obj
{
{1, true, 2.0f },
{5, false, 7.0f},
{7, false, 9.0f},
{8, true, 0.0f},
};
//possibility - 2: without list initialization
/*obj.addToClass(1, true, 2.0f);
obj.addToClass(5, false, 7.0f);
obj.addToClass(7, false, 9.0f);
obj.addToClass(8, true, 0.0f);*/
return 0;
}
Вопрос - 1:
Что из перечисленного ниже эффективно или целесообразно использовать (хорошая практика) в вышеуказанном случае?Зачем?
// Idea - 1
SubClass(std::initializer_list<Base>&& all): vec(std::move(all)) {}
// Idea - 2
SubClass(std::initializer_list<Base> all): vec(all) {}
Вопрос - 2:
Работает ли функция addToClass(Arg&& ...args)
аналогично любой из двух вышеупомянутых идей?