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++: ??