Как стать автором
Обновить

Комментарии 12

>> sizeof...(args)/sizeof(int)
Зачем вы делите кол-во элементов на размер int? sizeof… возвращает кол-во variadic аргументов. В вашем примере вы получите 2/4 = 0.

Далее проблема с отсутствием универсальных ссылок.

Вот для примера: ideone.com/b9EjYl
Стоп, а зачем здесь универсальные ссылки?
А чтобы в будущем не мучиться с передачей различных данных. Не копировать данные лишний раз, не мучиться с пробросом константных и не константных данных. Скопировать int не сложно, но если в будущем понадобится что-то подобное для векторов, их уже копировать совсем плохо.
Нет, зачем ссылки я знаю и зачем универсальные тоже, это как раз я понял и откопал.
Но в данной функции кроме int иного невозможно (1000.5 пикселей — это уже что-то странное) и передача по ссылке здесь скорее overhead. Поэтому вместо ссылок я и выбрал только тип
Если бы вместо std::vector был бы QVector из Qt, все выглядело бы гораздо симпатичнее.
setAxisSize(QVector()<<1024<<1024);

В C++11 можно записать так:
setAxisSize( std::vector<int>() = {1024,1024} );

Интересно, а можно по подробнее или где про это можно почитать?
В C++11 добавили списки инициализации (std::initializer_list), я узнал об этом из небольшой заметки, в которой сравнивался C++03 и C++11. К статье приложена pdf со слайдами, описание начинается с 32 стр. К сожалению, подробно описать не могу, так как сам только-только начал погружаться в мир C++11 :)

Можно записать еще проще:
setAxisSize( {1024,1024} );
Благодарю. Есть еще приличная статья на вики, общее понимание дает
А еще можно использовать 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);
Синтаксис как в 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, чтобы избежать лишнего вызова конструктора копирования, но не уверен, т.к. немножко изменится семантика.
Да, можно и так, но я отказался от этого варианта, т.к. вносится функционал не связанный с темой библиотеки.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории