如何在可变参数模板函数中访问参数
How to access params in variadic template function
在 C/C++ 中制作可变参数函数的旧方法是使用 cstdarg 中定义的 va_list、va_start、va_arg、va_end。 C++11 自带可变函数模板语法,但如何访问值?
//example
#include <iostream>
using namespace std;
template <typename... types>
void print(types... Params){
//this is not working:
long Param1 = Params[0];
long Param2 = Params[1];
}
int main(){
print(123, 456);
print(123, "foobar");
}
这里有一个使用运算符<<的解决方案:
但实际上并不是单个函数调用,它是对operator<<的一系列调用,并且函数不能在全局范围内,它必须是类型中的方法。
这是一种非常简单(非破坏性)的方法,尽管可能不是最佳方法:
#include <iostream>
#include<tuple>
#include<cassert>
using namespace std;
template <typename... types>
void print(types... Params){
long Param1 = std::get<0>(std::tie(Params...));
long Param2 = std::get<1>(std::tie(Params...));
assert(Param1 == 123 and Param2 == 456);
}
int main(){
print(123, 456);
}
如果所有元素都是同一类型(假设您可以复制它们):
#include <iostream>
#include<tuple>
#include<cassert>
using namespace std;
template <typename... types>
void print(types... Params){
std::array<long, sizeof...(Params)> params = {Params...};
long Size = params.size();
long Param1 = params[0];
long Param2 = params[1];
assert(Size == 2 and Param1 == 123 and Param2 == 456);
}
int main(){
print(123, 456);
}
从你的问题中不清楚,但看起来你想打印列表中的所有元素,如果你只想这样做,那么你可以按如下方式进行(需要 C++17,但你可以通过 c++11 中的一些工作来做到这一点):
#include <iostream>
using namespace std;
template <typename... types>
void print(types... Params){
std::cout << "number of elements: " << sizeof...(Params) << " ";
((std::cout << Params), ...);
}
int main(){
print(123, 456);
}
在 C/C++ 中制作可变参数函数的旧方法是使用 cstdarg 中定义的 va_list、va_start、va_arg、va_end。 C++11 自带可变函数模板语法,但如何访问值?
//example
#include <iostream>
using namespace std;
template <typename... types>
void print(types... Params){
//this is not working:
long Param1 = Params[0];
long Param2 = Params[1];
}
int main(){
print(123, 456);
print(123, "foobar");
}
这里有一个使用运算符<<的解决方案:
但实际上并不是单个函数调用,它是对operator<<的一系列调用,并且函数不能在全局范围内,它必须是类型中的方法。
这是一种非常简单(非破坏性)的方法,尽管可能不是最佳方法:
#include <iostream>
#include<tuple>
#include<cassert>
using namespace std;
template <typename... types>
void print(types... Params){
long Param1 = std::get<0>(std::tie(Params...));
long Param2 = std::get<1>(std::tie(Params...));
assert(Param1 == 123 and Param2 == 456);
}
int main(){
print(123, 456);
}
如果所有元素都是同一类型(假设您可以复制它们):
#include <iostream>
#include<tuple>
#include<cassert>
using namespace std;
template <typename... types>
void print(types... Params){
std::array<long, sizeof...(Params)> params = {Params...};
long Size = params.size();
long Param1 = params[0];
long Param2 = params[1];
assert(Size == 2 and Param1 == 123 and Param2 == 456);
}
int main(){
print(123, 456);
}
从你的问题中不清楚,但看起来你想打印列表中的所有元素,如果你只想这样做,那么你可以按如下方式进行(需要 C++17,但你可以通过 c++11 中的一些工作来做到这一点):
#include <iostream>
using namespace std;
template <typename... types>
void print(types... Params){
std::cout << "number of elements: " << sizeof...(Params) << " ";
((std::cout << Params), ...);
}
int main(){
print(123, 456);
}