Комментарии 12
>> sizeof...(args)/sizeof(int)
Зачем вы делите кол-во элементов на размер int? sizeof… возвращает кол-во variadic аргументов. В вашем примере вы получите 2/4 = 0.
Далее проблема с отсутствием универсальных ссылок.
Вот для примера: ideone.com/b9EjYl
Зачем вы делите кол-во элементов на размер int? sizeof… возвращает кол-во variadic аргументов. В вашем примере вы получите 2/4 = 0.
Далее проблема с отсутствием универсальных ссылок.
Вот для примера: ideone.com/b9EjYl
+2
Спасибо, только начал разбираться с этой темой.
Поправил
Поправил
0
Стоп, а зачем здесь универсальные ссылки?
0
А чтобы в будущем не мучиться с передачей различных данных. Не копировать данные лишний раз, не мучиться с пробросом константных и не константных данных. Скопировать int не сложно, но если в будущем понадобится что-то подобное для векторов, их уже копировать совсем плохо.
+1
Если бы вместо std::vector был бы QVector из Qt, все выглядело бы гораздо симпатичнее.
setAxisSize(QVector()<<1024<<1024);
В C++11 можно записать так:
setAxisSize( std::vector<int>() = {1024,1024} );
+4
Интересно, а можно по подробнее или где про это можно почитать?
0
В C++11 добавили списки инициализации (std::initializer_list), я узнал об этом из небольшой заметки, в которой сравнивался C++03 и C++11. К статье приложена pdf со слайдами, описание начинается с 32 стр. К сожалению, подробно описать не могу, так как сам только-только начал погружаться в мир C++11 :)
Можно записать еще проще:
Можно записать еще проще:
setAxisSize( {1024,1024} );
+3
А еще можно использовать Boost.Assignment:
Или более длинную конструкцию:
std::vector<int> v;
v += 1,2,3,4,5,6,7,8,9;
Или более длинную конструкцию:
std::vector<int> value = boost::assign::list_of(1024)(1024);
0
Синтаксис как в Qt можно легко и самому реализовать:
Код
Возможно стоило захватывать элемент по универсальной ссылке и использовать template<typename T>
std::vector<T>& operator<<(std::vector<T>& vec, const T& element_to_push)
{
vec.push_back(element_to_push);
return vec;
}
template<typename T>
std::vector<T>& operator<<(std::vector<T>& vec, T&& element_to_push)
{
vec.push_back(std::move(element_to_push));
return vec;
}
template<typename T>
std::vector<T>&& operator<<(std::vector<T>&& vec, const T& element_to_push)
{
vec.push_back(element_to_push);
return std::move(vec);
}
template<typename T>
std::vector<T>&& operator<<(std::vector<T>&& vec, T&& element_to_push)
{
vec.push_back(std::move(element_to_push));
return std::move(vec);
}
emplace_back
, чтобы избежать лишнего вызова конструктора копирования, но не уверен, т.к. немножко изменится семантика. +1
Зарегистрируйтесь на Хабре , чтобы оставить комментарий
Короткая заметка про шаблоны и смешание выведение типа и явного его задания