我可以在不强制执行 any/all 模板参数的情况下静态断言实体是模板 class 的实例化吗?

Can I static assert that an entity is instantiation of a template class without enforcing any/all template arguments?

可能标题的问题太笼统了,笼统是因为我很好奇

但是这个一般性问题是从一个具体的、不太通用的用例中衍生出来的。

我最初编写了一个函数来处理 class 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`...
}

然而这样做有点不可取,因为:

我能做的是在函数的第一行保留 autostatic_asserting,使 a 成为 std::array<A,2>std::array<A,3>,但将来我可能也想处理这个案子4

所以我只是想知道是否有办法断言变量 a 是给定模板 class 的实例,例如std::array未指定所有 模板参数。

一般来说,给定一个像这样的模板 class,

template<typename A, int n, typename B, int m>
class C { /* impl */ };

是否可以断言变量 aC<some_class,some_number,?,?> 类型?

只需将您的函数设为模板即可。 N会自动推导。

template<std::size_t N>
auto fun(std::array<A,N>& a) {
   // ... do things, which depend on `auto` having deduced a `std::array<A,N>` for some `N`...
}