我可以在不强制执行 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`...
}
然而这样做有点不可取,因为:
- 代码比它可能的要少 self-documenting:其他人(或一个月后的我自己)必须去看看里面
fun
才能理解它使用 a
假设它是一个std::array<A,N>
for a general N
;
- 错误消息没有它们应该的那么清楚:错误是没有函数匹配这个调用,而我希望错误是此函数适用于
std::array
of A
s.
我能做的是在函数的第一行保留 auto
和 static_assert
ing,使 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 */ };
是否可以断言变量 a
是 C<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`...
}
可能标题的问题太笼统了,笼统是因为我很好奇
但是这个一般性问题是从一个具体的、不太通用的用例中衍生出来的。
我最初编写了一个函数来处理 class A
:
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`...
}
然而这样做有点不可取,因为:
- 代码比它可能的要少 self-documenting:其他人(或一个月后的我自己)必须去看看里面
fun
才能理解它使用a
假设它是一个std::array<A,N>
for a generalN
; - 错误消息没有它们应该的那么清楚:错误是没有函数匹配这个调用,而我希望错误是此函数适用于
std::array
ofA
s.
我能做的是在函数的第一行保留 auto
和 static_assert
ing,使 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 */ };
是否可以断言变量 a
是 C<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`...
}