最終更新日時: 2026年05月07日 12時33分06秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<meta>

# std::meta::reflect_constant_string(C++26)

    namespace std::meta {
      template <ranges::input_range R>
      consteval info reflect_constant_string(R&& r);
    }

## 概要

文字のRangeからヌル終端文字配列のリフレクションを生成する。

`define_static_string()`は`const CharT*`を返すため配列のサイズ情報が失われるが、この関数はサイズ情報を保持した配列のリフレクションを返す。そのため、サイズをテンプレートパラメータとして推論する必要がある型（`FixedString<N>`など）にスプライスで渡すことができる。

また、`define_static_string()`はこの関数を内部で使用して実装されている。

## 戻り値

`r`の要素をコピーしたヌル終端文字配列`const CharT[sizeof...(V)+1]`のテンプレートパラメータオブジェクトのリフレクションを返す。

## 例

    #include <meta>
    #include <algorithm>
    #include <cstddef>

    template <std::size_t N>
    struct FixedString {
      char data[N] = {};
      constexpr FixedString(const char (&str)[N]) {
        std::ranges::copy(str, str + N, data);
      }
    };

    template <FixedString S>
    struct Named {};

    int main() {
      // define_static_stringはconst char*を返すためFixedStringのサイズを推論できない
      // using Err = Named<std::define_static_string("hello")>;  // エラー

      // reflect_constant_stringはサイズ付き配列のリフレクションを返すため推論できる
      // (テンプレート引数で使うときはスプライスをカッコで囲む必要がある)
      using Ok = Named<([:std::meta::reflect_constant_string("hello"):])>;
    }

### 出力

## バージョン

### 言語

- C++26

### 処理系

- Clang: ??
- GCC: 16 (`-freflection` オプション指定) ✅
- Visual C++: ??

## 関連項目

- `define_static_string`
- `reflect_constant_array`

## 参照

- P3491R3 `define_static_{string,object,array}`