类模板能否从构造函数的参数包推导模板参数N?
类模板参数推导问题
原类模板代码
template<typename T, size_t N> struct foo { template<std::same_as<T>... Ts> foo(Ts... ts); };
问题
能否通过构造函数接收的参数包Ts的大小,推导类模板的参数N,从而实现如下简洁实例化:
auto f = foo(10,10,10); // 期望推导出foo<int, 3>
还是必须显式指定foo<int, 3>(10,10,10)?
解答
这个需求可以实现,但原类模板的写法做不到,需要调整实现方式:
1. 最简便的方式:添加推导指引
给foo类模板补充一个推导指引,明确告诉编译器如何从构造参数推导N:
template<typename T, typename... Ts> foo(T, Ts...) -> foo<T, 1 + sizeof...(Ts)>;
这样当你写auto f = foo(10,10,10);时,编译器会自动推导出T=int,参数总数是3,因此N=3,最终得到foo<int,3>的实例。
原构造函数的std::same_as<T>... Ts约束会确保所有参数类型都和T一致,和推导指引完全兼容,不会出现类型不匹配的问题。
2. 原写法为什么无法直接推导?
原类模板中,类模板参数N和构造函数的函数模板参数Ts...是完全独立的,C++没有默认规则让编译器把N和sizeof...(Ts)绑定起来,所以编译器不知道N应该等于参数包的大小,只能要求你显式指定N。
内容的提问来源于stack exchange,提问作者JensB
相关产品推荐
相关产品推荐

