у меня есть 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>
Ктор должен быть активирован. Как это можно исправить?
Это разница между инициализацией ()
и инициализация по {}
в вашем конструкторе вы также должны использовать {}
инициализация.
template <typename ...Tn> wrapper(Tn ...args) : v{args...} {}
Кстати, если вы хотите только initializer_list
c-tor, почему бы просто не написать этот c-tor?
wrapper(std::initializer_list<int> args) : v(args) {}
Других решений пока нет …