【发布时间】:2021-03-01 21:48:18
【问题描述】:
可能标题里的问题太笼统了,因为好奇所以笼统
但这个通用问题源于一个具体的、不那么通用的用例。
我最初编写了一个函数来处理类 A 的 2 个元素的数组:
auto /* return type is not relevant */ fun(std::array<A,2>& a) {
// ... do things...
}
然后我决定将功能扩展到 a 有 3 个元素的情况。使用std::vector<A> 处理此问题不是一种选择,因为这两个场景永远不会相互交互,我也不需要push_back on/pop_back from a。
为了让两者协同工作,我放弃了显式参数类型,转而依赖auto:
auto /* ditto */ fun(auto& a) {
// ... do things, which depend on `auto` having deduced a `std::array<A,N>` for some `N`...
}
但是这样做有点不可取,因为:
- 代码的自我记录比它可能的要少:其他人(或一个月内的我自己)将不得不查看
fun的内部,以了解它使用a,假设它是@987654333 @通用N; - 错误消息比它们可能的不太清楚:错误将类似于 没有函数与此调用匹配,而我希望错误是 此函数有效与
std::array的As。
我能做的是将auto 和static_asserting 保留在a 为std::array<A,2> 或std::array<A,3> 的函数的第一行,但将来我可能想处理此案@ 987654342@也是。
所以如果有办法断言变量a 是给定模板类的实例,我只是在徘徊,例如std::array,并非全部指定了模板参数。
一般来说,给定一个像这样的模板类,
template<typename A, int n, typename B, int m>
class C { /* impl */ };
是否可以断言变量a 的类型为C<some_class,some_number,?,?>?
【问题讨论】:
-
看来你的问题和this一样。或者至少是相关的。
标签: c++ templates template-meta-programming static-assert