问题描述
#include <iostream>
#include <tuple>
#include <utility>
template <typename... T>
decltype(auto) getParameterPackVals(T&&... Args) noexcept {
return std::get<1>(std::forward_as_tuple(std::forward<T>(Args)...));
}
int main() {
std::cout << getParameterPackVals(2,1.0,2.0,3.0,4.0,5.0) << std::endl;
//print(1.0,"Hello","This","is","An","Honour");
return 0;
}
这是我当前有效的代码,使用 1
作为变量的占位符。尽管当我用变量替换 1
时(我在 size_t
的参数中同时尝试了 int
和 getParameterPackVals
),但它不起作用。
template <size_t V,typename... T>
decltype(auto) getParameterPackVals(V n,T&&... Args){
return std::get<n>(std::forward_as_tuple(std::forward<T>(Args)...));
}
这是否与我对 std::get
函数的工作原理的理解有差距?有没有办法让这个工作正常,或者我需要编写一个全新的函数?
解决方法
哇,这是我自己解决的第一次!
因此,在头脑风暴时,我记得如果我将模板参数命名为 size_t V
,我可以在调用参数时将其与 <V>
一起传递。所以我从函数参数中取出 V n
并将该函数称为 getParameterPackVals<2>(1.0,2.0,3.0,4.0,5.0)
。现在的最终代码是:
#include <iostream>
#include <tuple>
#include <utility>
template <size_t V,typename... T>
decltype(auto) getParameterPackVals(T&&... Args) noexcept{
return std::get<V>(std::forward_as_tuple(std::forward<T>(Args)...));
}
int main() {
std::cout << getParameterPackVals<2>(1.0,5.0) << std::endl;
return 0;
}
我会留下这个问题,以防其他人遇到类似的问题。