C++参数包访问超出范围



我对参数包有点陌生,遇到了一个与超出范围索引有关的问题。为了简化问题,我想访问函数内参数包中的第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":未找到匹配的重载函数

试试这个(从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是基于零的!因此,对于一个工作示例,您不需要三个参数,而是至少需要四个参数。

最新更新