Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::vector的可变模板压缩参数_C++_Templates_Variadic Templates - Fatal编程技术网

C++ std::vector的可变模板压缩参数

C++ 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

我是模板新手,我真的不明白为什么这不起作用。我希望向量是用这些值构造的

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<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
?这很伤人,谢谢,它可以工作,但我不明白为什么在折叠的版本中放置一个coma
endl)。。。“
。你能给我解释一下吗?@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;
}