C++ std::vector的可变模板压缩参数
我是模板新手,我真的不明白为什么这不起作用。我希望向量是用这些值构造的 main.cppC++ std::vector的可变模板压缩参数,c++,templates,variadic-templates,C++,Templates,Variadic Templates,我是模板新手,我真的不明白为什么这不起作用。我希望向量是用这些值构造的 main.cpp 模板 void int_printf(T…args) { 向量向量={args…}; 用于(自动&v:vec) { std::cout代码中的问题是,T在此上下文中不是一个模板参数,而是一个模板参数包,它将扩展为T=[int,int,int,int]在您的示例中。std::vector要求将类型作为模板参数传递,而不是模板参数包。您可以使用std::common\u type解决此问题: #include
模板
void int_printf(T…args)
{
向量向量={args…};
用于(自动&v:vec)
{
std::cout代码中的问题是,T
在此上下文中不是一个模板参数,而是一个模板参数包,它将扩展为T=[int,int,int,int]
在您的示例中。std::vector
要求将类型作为模板参数传递,而不是模板参数包。您可以使用std::common\u type
解决此问题:
#include<type_traits>
template <typename ...T>
void int_printf(T ...args)
{
//use std::common_type to deduce common type from template
// parameter pack
std::vector<typename std::common_type<T...>::type> vec = {args...};
for(auto& v:vec)
{
std::cout << v << std::endl;
}
}
#包括
模板
void int_printf(T…args)
{
//使用std::common_type从模板推断出公共类型
//参数包
向量向量={args…};
用于(自动&v:vec)
{
std::cout当您执行std::vector
时,T
不是单一类型,而是一组类型。您不能将其用于向量,因为它需要元素的单一类型
有两种方法可以处理这个问题。第一种方法是对向量的类型进行硬编码。这会使代码不那么通用,但会对您起作用,因为您的函数名为int\u printf
,而不是anything\u print
另一个选项是获取元素的公共类型,如
template <typename ...T>
void int_printf(T ...args)
{
std::vector<std::common_type_t<T...>> vec = {args...};
for(auto& v:vec)
{
std::cout << v << std::endl;
}
}
现在,除了int
,你不能调用这个函数,但它可以有你想要的任何函数。另一个稍微复杂一点的方法是添加一个初始模板参数,指定vec
的类型,如下所示:
#include <iostream>
#include <vector>
template <typename T, typename ... Args>
void int_printf(Args ... args)
{
std::vector<T> vec = {args...};
for (auto& v : vec)
{
std::cout << v << std::endl;
}
}
int main()
{
int_printf<int>(1,2,3,4);
return 0;
}
#包括
#包括
模板
void int_printf(Args…Args)
{
向量向量={args…};
用于(自动&v:vec)
{
std::cout关于int_printf(3,nullptr,-9e134,“hello”,main);
,vec的类型是什么?vec
?这很伤人,谢谢,它可以工作,但我不明白为什么在折叠的版本中放置一个comaendl)。。。“
。你能给我解释一下吗?@ElGusanito我所做的是滥用逗号运算符。我所说的是do(std::cout@MooingDuck)看起来很有趣,但我是如何实现它的?
template <typename ...T>
void int_printf(T ...args)
{
((std::cout << args << std::endl), ...);
// ^^ ^
// | do this part ^ ^ |
// | for each parameter | |
// start fold expression end fold
}
template <typename ...T, std::enable_if_t<std::conjunction_v<std::is_same<T, int>...>, bool> = true>
void int_printf(T ...args)
{
((std::cout << args << std::endl), ...);
}
#include <iostream>
#include <vector>
template <typename T, typename ... Args>
void int_printf(Args ... args)
{
std::vector<T> vec = {args...};
for (auto& v : vec)
{
std::cout << v << std::endl;
}
}
int main()
{
int_printf<int>(1,2,3,4);
return 0;
}