0

我对参数包有点陌生,遇到了与超出范围索引相关的问题。为了简化问题,我想访问函数内参数包中的第 n 个元素(比如说第 3 个)。如果函数调用未传递 3 个(或更多)参数,则返回 nullptr。也许有一个递归解决方案可以安全地忽略较少参数的情况?

template <int I, class... Ts>
decltype(auto) get_element(Ts&&... ts) {
    return std::get<I>(std::forward_as_tuple(ts...));
}

    template <typename... Args>
    void foo(Args ... args)
    {
        auto p = get_element<3>(args...);
    }


int main()
{
    int a = 1;
    foo(a);
    return 0;
}

错误 C2338 元组索引超出范围
错误 C2672 'std::get': 找不到匹配的重载函数

4

1 回答 1

0

试试这个(C++17 起)

template <int I, class... Ts>
  decltype(auto) get_element(Ts&&... ts) {
  if constexpr (I < sizeof...(Ts))
    return std::get<I>(std::forward_as_tuple(ts...));
  else
    return nullptr;
}

现在,您只会收到未使用参数的编译器警告。我认为这可能是有意的,因为您已经以这种方式绕过了编译时安全性。

还要记住 std::get 是从零开始的!因此,对于一个工作示例,您不需要三个而是至少四个参数。

于 2020-12-03T10:35:50.607 回答