编写一个接收std::meta::info的函数

编程语言 2026-07-08

我正在尝试编写一个函数,它将 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章