У меня есть что-то вроде следующего кода:Как правильно использовать ссылки с переменным числом шаблонов
template<typename T1, typename T2, typename T3, typename T4>
void inc(T1& t1, T2& t2, T3& t3, T4& t4) { ++t1; ++t2; ++t3; ++t4; }
template<typename T1, typename T2, typename T3>
void inc(T1& t1, T2& t2, T3& t3) { ++t1; ++t2; ++t3; }
template<typename T1, typename T2>
void inc(T1& t1, T2& t2) { ++t1; ++t2; }
template<typename T1>
void inc(T1& t1) { ++t1; }
я хотел бы переопределять его, используя предложенные VARIADIC шаблоны из будущего стандарта. Однако все примеры, которые я видел до сих пор в Интернете, похоже, являются примерами printf, разница здесь, по-видимому, заключается в использовании ссылок. Я придумал следующий:
inline void inc() { }
template<typename T>
inline void inc(T&& t) { ++t; }
template<typename T,typename ... Args>
inline void inc(T&& t, Args&& ... args) { ++t; inc(args...); }
Что я хотел бы знать:
Должен ли я при помощи R-значение вместо ссылок?
Возможные подсказки или рекомендации относительно того, как правильно выполнить то, что я хочу.
Какие гарантии предлагает новый предложенный стандарт в отношении проблемы рекурсивных вызовов функций, есть ли некоторые признаки того, что вышеупомянутая вариационная версия будет такой же оптимальной, как и оригинал? (Я должен добавить встроенный или некоторые, такие?)
Из любопытства я бросил эти функции в gcc4.5, и рекурсия была удалена, и все это получилось вложенным. –
'T &&' не является ссылкой на rvalue, потому что он успешно выполняет параметр шаблона (в данном случае 'T'). Поэтому его универсальная справочная/переадресационная ссылка, которая привязывается ко всему. То же самое верно для 'Arg &&'. См. [Подробно] (http://en.cppreference.com/w/cpp/language/reference#Forwarding_references). –