You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类模板能否从构造函数的参数包推导模板参数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:35:16