编写一个接收std::meta::info的函数
我正在尝试编写一个函数,它将 std::meta::info 作为参数,然后在其中使用它。我的计划最终是编写一个递归函数来统计一个类型拥有的基类数量。
我理解函数参数不是常量表达式,所以这个错误是可以预期的。
要把它放进一个函数中并让它编译,我需要做些什么?
consteval auto func(std::meta::info type) -> void {
constexpr auto ctx = std::meta::access_context::unchecked();
constexpr auto bases = std::define_static_array(bases_of(type, ctx));
}
错误:
<source>: In function 'consteval void func(std::meta::info)':
<source>:5:60: error: 'type' is not a constant expression
5 | constexpr auto bases = std::define_static_array(bases_of(type, ctx));
| ^~~~
<source>: In function 'int main()':
<source>:10:9: error: call to consteval function 'func(^^std::exception)' is not a constant expression
10 | func(^^std::exception);
| ~~~~^~~~~~~~~~~~~~~~~~
<source>:10:9: error: 'consteval void func(std::meta::info)' called in a constant expression
https://godbolt.org/z/z6hY7r7fr
解决方案
bases 不能被设为一个 constexpr 变量。然而,这并不影响你计算 base 的大小,因此这将起作用:
consteval auto func(std::meta::info type) {
constexpr auto ctx = std::meta::access_context::unchecked();
auto bases = bases_of(type, ctx);
return bases.size();
}
static_assert(func(^^std::exception) == 0);
static_assert(func(^^std::meta::exception) == 1);
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。