template <class T>
consteval basic_format_string(const T& s); // (1) C++23
basic_format_string(runtime-format-string<charT> s) noexcept; // (2) C++26
概要
basic_format_string
オブジェクトを構築する。
- (1) : コンパイル時の書式文字列を受け取る
- (2) : 実行時の書式文字列を受け取る
テンプレートパラメータ制約
const T&
はconvertible_to<basic_string_view<charT>>
のモデルであること
効果
メンバ変数としてbasic_string_view<charT> str;
が定義されるとして、str(s)
で初期化する。
備考
- この関数の呼び出しは、
str
がargs
の書式文字列であるようなArgs
型のargs
が存在しない限り、コア定数式ではない- 意味 : 書式文字列が引数列
args
と合わせて正しくなければ、定数式評価 (consteval
) が実行できずコンパイルエラーとなる - 以下のようなコードはコンパイルエラーとなる:
int main() { auto str = std::format("{:d}", "I am not a number"); // コンパイルエラー!型が合わない }
- 意味 : 書式文字列が引数列
実装例
// 書式文字列のチェック
template <class CharT, class... Args>
consteval void fmt_checker(std::basic_string_view<CharT> str)
{
// …
if (/*カッコの開き・閉じが一致しない場合*/) {
throw "invalid brackets"; // throw式は定数式で実行できないため、
// このパスを通ったらコンパイルエラーになる
}
// …
if (/*型が合わない時*/) {
throw "invalid type specifier";
}
// …
}
namespace std {
template <class CharT, class... Args>
struct basic_format_string {
std::basic_string_view<CharT> str;
template <class T>
requires std::convertible_to<const T&, std::basic_string_view<charT>>
consteval basic_format_string(const T& s)
: str(s)
{
fmt_checker<CharT, Args...>(str);
}
};
template <class... Args>
using format_string = basic_format_string<char, std::type_identity_t<Args>...>;
}
バージョン
言語
- C++23
処理系
- Clang: ??
- GCC: 13.1 ✅
- Visual C++: ??