C++ - создание класса-оболочки вокруг структуры с тем же синтаксисом, что и у структуры

Это продолжение моего предыдущего вопроса: C++ - Создание класса-оболочки с тем же синтаксисом, что и у обернутых данных

По сути, я пытаюсь создать шаблон оболочки для некоторых данных и построить/установить оболочку с тем же синтаксисом, что и данные.

Если я использую что-то вроде структуры, я могу добиться этого, перенаправив параметры, чтобы синтаксис мог быть:

struct SomeStruct{

    int a, b, c;

    SomeStruct(int _a, int _b, int _c) {/*...*/}

};

// ...

WrapperClass<SomeStruct> wrapped_struct1{1,2,3};
WrapperClass<SomeStruct> wrapped_struct2 = {1,2,3};
WrapperClass<SomeStruct> wrapped_struct3( 1,2,3);

Проблема в том, что это работает, только если у меня есть этот конструктор, определенный в структуре. Могу ли я заставить его работать, не определяя его?

Обертка в настоящее время выглядит так:

template<typename T> class WrapperClass{
public:
    T data;    
    template <typename...Args>
    WrapperClass(Args&&...args) : data(std::forward<Args>(args)...) {}
};

person Newline    schedule 16.11.2019    source источник


Ответы (1)


Вместо этого вы можете перейти на инициализацию списка. затем

Если T является агрегатным типом, агрегированная инициализация.

e.g.

template <typename...Args>
WrapperClass(Args&&...args) : data{std::forward<Args>(args)...} {}
//                                ^                           ^
person songyuanyao    schedule 16.11.2019
comment
Благодарю вас! Нужно ли/можно ли сохранить оба конструктора или достаточно инициализации списка? - person Newline; 16.11.2019
comment
@Newline Вы не можете, они не могут быть перегружены одной и той же подписью. Вы должны выбрать один, обратите внимание, что в некоторых случаях эффект может быть другим; например для std::vector (10, 42) создаст vector, содержащий 10 элементов со значением 42; {10, 42} создаст vector, содержащий 2 элемента со значениями 10 и 42. Вы также можете применить SFINAE или специализацию шаблона для выполнения отправки. - person songyuanyao; 16.11.2019
comment
Теперь все хорошо, за исключением того, что конструктор копирования и присваивание не работают. Он выдает ошибку, говорящую о том, что не может преобразовать «WrapperClass‹SomeStruct›» в «int» при инициализации, и указывает на функцию list-init:S. Даже если я явно определяю файл copy-ctor. - person Newline; 16.11.2019
comment
Спасибо! Я пытаюсь понять, как сделать то же самое с вариативными шаблонами. Как остановить вызов этой функции, когда Args имеет значение WrapperClass‹T›, но не знаю, как это сделать. Может быть, мне придется задать другой вопрос :) - person Newline; 16.11.2019