1

考虑以下代码:

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

我想找出正确的语法/* Something1 *//* Something2 */为了转发由Index输入指定的元素tuple。我知道可以使用其他概念/语法,但是为了正确理解事物在这种情况下的工作方式(将其视为学术练习),我想要一个满足以下条件的答案:

  • 不同情况下没有重载:只有一个模板化函数forward
  • 除了/* Something1 */and没有变化/* Something2 */_Type&&Type
  • 元编程的疯狂,decltype并被std::declval接受

例如,如果Tuple = std::tuple<char, int, double>forward<2>(tuple)则应转发第三个元素(如果元组作为 const 引用传递,则函数应返回对 的 const 引用double)。

4

1 回答 1

1

答案取决于您想使用该功能实现什么。一般来说,向成员传播右值是一个坏主意。但是,标准库中已经有一个实现。您可以通过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));
}
于 2013-08-17T16:03:36.037 回答