转发元组的元素

时间:2013-08-17 15:02:36

标签: c++ templates c++11 metaprogramming perfect-forwarding

请考虑以下代码:

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

我想找到/* Something1 *//* Something2 */的正确语法,以便转发输入Index的{​​{1}}指定的元素。我知道其他概念/语法可用,但为了正确理解事物在这样的环境中是如何工作的(将其视为学术练习),我想要一个满足以下条件的答案:

  • 不同情况下没有重载:只有一个模板化函数tuple
  • 除了forward/* Something1 */之外没有变化(如果它应该是/* Something2 */而不是Type&&,则可能在返回类型上)
  • 元编程疯狂,Typedecltype被接受

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

1 个答案:

答案 0 :(得分: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));
}