2013-08-17 2 views
1

Рассмотрим следующий код:вперед элемент кортежа

template <unsigned int Index, class Tuple, class Type = /* Something1 */> 
Type forward(Tuple&& tuple) 
{ 
    return /* Something2 */; 
} 

Я хотел бы найти то, что является правильным синтаксис /* Something1 */ и /* Something2 */ для того, чтобы направить элемент, указанный Index входа tuple. Я знаю, что другие понятия/синтаксис будет доступны, но для того, чтобы понять правильно, как вещи работают в таком контексте (рассматривать это как академический exercice), я хотел бы получить ответ, удовлетворяющий следующие условия:

  • нет перегрузки для различных случаев: там будет только одна шаблонный функция forward
  • никаких изменений, кроме /* Something1 */ и /* Something2 */ (и, возможно, на возвращаемый тип, если оно должно быть Type&& вместо Type)
  • метапрограммированием crazyness, decltype и std::declval принимаются

Например, если Tuple = std::tuple<char, int, double>, то forward<2>(tuple) должен направить третий элемент (если кортеж передаются в качестве константной ссылки, то функция должна возвращать константную ссылку на double).

+1

Не могли бы вы уточнить, если в вашем примере вы хотите 'type' быть' double' или '' двойной &&? Я вижу, что ваш вопрос действительно задает этот вопрос, но вы можете проектировать свой API. Возможно, вы могли бы рассказать нам, что вы хотите от этого API. –

+0

@Howard: Не должно быть 'double' или' double & 'для lvalue' tuple'? – Xeo

+0

@ DieterLücking: это не домашнее задание, я работаю над суперкомпьютером ... это «я хочу быть уверенным, чтобы понять, что здесь происходит, и лучший способ сделать это - использовать академический подход» – Vincent

ответ

1

Ответ зависит от того, чего вы хотите достичь с помощью этой функции. В общем, это плохая идея распространять rvalue-ness для членов. Однако в стандартной библиотеке уже реализована реализация. Вы можете использовать std::get следующим образом:

template < 
    std::size_t Index, 
    typename Tuple, 
    typename Type = decltype(std::get<Index>(std::declval<Tuple>()))> 
auto forward(Tuple&& tuple) -> Type 
{ 
    return std::get<Index>(std::forward<Tuple>(tuple)); 
} 
+4

Также обратите внимание, что это делает функцию полностью прозрачной оберткой поверх 'std :: get', и, следовательно, ее бессмысленно: вы можете просто использовать' std :: get (tuple) 'непосредственно на сайте. –

+0

'decltype (std :: get (std :: declval ()))' может быть заменен на 'typename std :: tuple_element :: type' (C++ 11) или' std :: tuple_element_t '(C++ 14). –

Смежные вопросы