非类型模板实参的类模板特化可行性及实现问询
当然可以实现这个需求!
不过得先澄清一点:严格意义上的模板特化是基于同一个主模板的参数进行定制,但你要的是让foo<float>(类型实参)和foo<20>(非类型实参)分别匹配不同的模板实现,其实用模板重载(同名但参数不同的模板)更直接,完全能达到你要的效果。
下面是具体的代码实现:
// 原模板:接受类型实参,比如 foo<float> 会匹配这个 template <typename T> class foo { T t; }; // 重载的模板:接受非类型实参,比如 foo<20> 会匹配这个 template <auto N> class foo { // 这里可以写你想要的特化版本逻辑,比如: static constexpr auto value = N; // 其他成员或方法... };
这样写的话:
foo<float> my_foo;会自动匹配第一个模板(原版本)foo<20> my_other_foo;会匹配第二个模板(非类型实参的版本)
如果你非要用特化的方式(基于同一个主模板),那需要先把主模板定义成更通用的可变参数模板,再分别特化类型参数和包装后的非类型参数,但这种方式要求用户写foo<std::integral_constant<int,20>>而非直接foo<20>,实用性远不如上面的重载方式,所以更推荐用模板重载来实现你的需求。
内容的提问来源于stack exchange,提问作者Aart Odding
相关产品推荐
相关产品推荐

