Как сделать так, чтобы класс-оболочка передавал аргументы своего конструктора в конструктор std :: vector?

у меня есть wrapper класс, чтобы обернуть std::vector<int> элемент данных. Я хочу wrapperконструктор для передачи своих аргументов vector<int>Ctor. Я попытался использовать конструктор шаблонов variadic для реализации этого. поскольку std::vector<int> v{1, 2, 3} построен его std::initializer_list Ктор, я хочу wrapper активировать vector«s initializer_list Ctor, когда я делаю

wrapper mywrap{1, 2, 3},

Но я не получил желаемого результата:

#include <iostream>
#include <vector>

struct wrapper {
std::vector<int> v;
template <typename ...Tn> wrapper(Tn ...args) : v(args...) {}
};

int main() {
//----Output----
wrapper wrap1{ 1 };
std::cout << wrap1.v.size() << std::endl;               // 1
std::cout << wrap1.v.at(0) << std::endl;                // 0
wrapper wrap2{ 1, 2 };
std::cout << wrap2.v.size() << std::endl;               // 1
std::cout << wrap2.v.at(0) << std::endl;                // 2
wrapper wrap3{ 1, 2, 3 };                               // error
wrapper wrap4{ std::initializer_list<int>{ 1, 2, 3 } }; // OK
}

Вывод показывает:

wrapper wrap1{ 1 }; звонки explicit vector (size_type n);,

wrapper wrap2{ 1, 2 }; звонки

vector (size_type n, const value_type& val, const allocator_type& alloc = allocator_type());,

wrapper wrap3 не удается, когда initializer_list<int> не указано

Во всех случаях я хотел vector«s initializer_list<int> Ктор должен быть активирован. Как это можно исправить?

2

Решение

Это разница между инициализацией () и инициализация по {}в вашем конструкторе вы также должны использовать {} инициализация.

template <typename ...Tn> wrapper(Tn ...args) : v{args...} {}

Кстати, если вы хотите только initializer_list c-tor, почему бы просто не написать этот c-tor?

wrapper(std::initializer_list<int> args) : v(args) {}
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]