这是否有效: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,还是在标准中确实提到了定义明确?
答案 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
的参数包。
此行为已由标准明确定义。