使用参数包作为模板类的类型名

时间:2019-10-19 22:21:59

标签: c++ templates variadic-templates

这是否有效:https://godbolt.org/z/_i9dwf

#include <typeinfo>
#include <iostream>

template<typename T>
struct Container
{
};

void fn()
{
    return;
}

template<typename T, typename...type_pack>
void fn(const Container<T>& head, const Container<type_pack>&... args)
{
    std::cout << "I am an " << typeid(T).name() << "\n";
    fn(args...);
    return;
}

int main()
{
    fn(Container<int>{}, Container<float>{});
    return 0;
}

C ++是否实际上允许这种扩展,或者此实现是基于编译器定义的?我不相信我在其他地方看到过这种语法:Container<type_pack>&...。这只是我想实现的目标,而令人惊讶的是它起作用了。所以我的问题是,这是UB,还是在标准中确实提到了定义明确?

2 个答案:

答案 0 :(得分:2)

为什么不呢?

在您的代码中,type_pack

template<typename T, typename...type_pack>
void fn(const Container<T>& head, const Container<type_pack>&... args)

在推论上下文中,因此编译器可以从

推导float的{​​{1}}。
type_pack...

答案 1 :(得分:2)

您要指定数量可变的参数,类型为computedMatch,模板化的类型将用于推导Container。例如,如果您致电:

type_pack

fn(Container<int>{}, Container<float>{}); 将代表type_pack类型。但是,如果您致电:

float

fn(Container<int>{}, Container<float>{}, Container<int>{}, Container<std::string>{}); 将代表type_pack的参数包。

此行为已由标准明确定义。