Merge pull request #291 from franzpoeschel/namespace-versioning

Use an inline namespace to distinguish emitted symbols by version numbers e4051f77d7
This commit is contained in:
ToruNiina
2025-05-17 07:21:19 +00:00
commit e671b8e3bd
193 changed files with 19632 additions and 0 deletions

View File

@@ -0,0 +1,204 @@
<!doctype html><html lang=ja dir=ltr><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="
型をカスタマイズする
#
toml::value は integer_type として std::int64_t を、
table_type として std::unordered_map<key_type, value_type> を使用します。
しかし、場合によっては boost::multiprecision::int128_t や、 std::map を使用したい場合もあります。
そのため、 toml::value は template 引数を取って格納する型を変えられるように実装されています。
std::string が実際には std::basic_string<char, std::char_traits<char>, std::allocator<char>> の
エイリアスであるように、 toml::value は実際には toml::basic_value<toml::type_config> のエイリアスです。
ここでは、 toml::type_config が持つ型と、異なる config 型を定義する方法を説明します。
type_config
#
type_config は、以下のメンバ型とstaticメンバ関数を持つクラスです。
namespace toml
{
struct type_config
{
using comment_type = preserve_comments;
using boolean_type = bool;
using integer_type = std::int64_t;
using floating_type = double;
using string_type = std::string;
template<typename T>
using array_type = std::vector<T>;
template<typename K, typename T>
using table_type = std::unordered_map<K, T>;
static result<integer_type, error_info>
parse_int(const std::string& str, const source_location src, const std::uint8_t base);
static result<floating_type, error_info>
parse_float(const std::string& str, const source_location src, const bool is_hex);
};
}
toml::basic_value<TypeConfig> は、格納する boolean_type を TypeConfig::boolean_type、
格納する integer_type を TypeConfig::integer_type 、のようにして定義しています。"><meta name=theme-color media="(prefers-color-scheme: light)" content="#ffffff"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#343a40"><meta name=color-scheme content="light dark"><meta property="og:url" content="https://toruniina.github.io/toml11/ja/docs/features/configure_types/"><meta property="og:site_name" content="toml11"><meta property="og:title" content="configuring types"><meta property="og:description" content="型をカスタマイズする # toml::value は integer_type として std::int64_t を、 table_type として std::unordered_map<key_type, value_type> を使用します。
しかし、場合によっては boost::multiprecision::int128_t や、 std::map を使用したい場合もあります。
そのため、 toml::value は template 引数を取って格納する型を変えられるように実装されています。
std::string が実際には std::basic_string<char, std::char_traits<char>, std::allocator<char>> の エイリアスであるように、 toml::value は実際には toml::basic_value<toml::type_config> のエイリアスです。
ここでは、 toml::type_config が持つ型と、異なる config 型を定義する方法を説明します。
type_config # type_config は、以下のメンバ型とstaticメンバ関数を持つクラスです。
namespace toml { struct type_config { using comment_type = preserve_comments; using boolean_type = bool; using integer_type = std::int64_t; using floating_type = double; using string_type = std::string; template<typename T> using array_type = std::vector<T>; template<typename K, typename T> using table_type = std::unordered_map<K, T>; static result<integer_type, error_info> parse_int(const std::string& str, const source_location src, const std::uint8_t base); static result<floating_type, error_info> parse_float(const std::string& str, const source_location src, const bool is_hex); }; } toml::basic_value<TypeConfig> は、格納する boolean_type を TypeConfig::boolean_type、 格納する integer_type を TypeConfig::integer_type 、のようにして定義しています。"><meta property="og:locale" content="ja"><meta property="og:type" content="article"><meta property="article:section" content="docs"><title>configuring types | toml11</title>
<link rel=manifest href=/toml11/manifest.json><link rel=icon href=/toml11/favicon.png><link rel=canonical href=https://toruniina.github.io/toml11/ja/docs/features/configure_types/><link rel=alternate hreflang=en href=https://toruniina.github.io/toml11/docs/features/configure_types/ title="configuring types"><link rel=stylesheet href=/toml11/book.min.ddac3efe7ea4c1007ff53e5a8fd67f12517e5d2e99984d8c67a18668f7ecaa03.css integrity="sha256-3aw+/n6kwQB/9T5aj9Z/ElF+XS6ZmE2MZ6GGaPfsqgM=" crossorigin=anonymous><script defer src=/toml11/fuse.min.js></script><script defer src=/toml11/ja.search.min.13aefbf6a803b591c02d5bc9a01dfe65fe37c31e2915c91573708d38e805d86c.js integrity="sha256-E6779qgDtZHALVvJoB3+Zf43wx4pFckVc3CNOOgF2Gw=" crossorigin=anonymous></script></head><body dir=ltr><input type=checkbox class="hidden toggle" id=menu-control>
<input type=checkbox class="hidden toggle" id=toc-control><main class="container flex"><aside class=book-menu><div class=book-menu-content><nav><h2 class=book-brand><a class="flex align-center" href=/toml11/ja/><span>toml11</span></a></h2><div class="book-search hidden"><input type=text id=book-search-input placeholder=検索 aria-label=検索 maxlength=64 data-hotkeys=s/><div class="book-search-spinner hidden"></div><ul id=book-search-results></ul></div><script>document.querySelector(".book-search").classList.remove("hidden")</script><ul class=book-languages><li><input type=checkbox id=languages class=toggle>
<label for=languages class="flex justify-between"><a role=button class="flex align-center"><img src=/toml11/svg/translate.svg class=book-icon alt=Languages>
日本語</a></label><ul><li><a href=https://toruniina.github.io/toml11/docs/features/configure_types/>English</a></li></ul></li></ul><ul><li><a href=/toml11/ja/docs/installation/>installation</a><ul></ul></li><li><input type=checkbox id=section-b4cfb5b55e913a8d853eacf5e8fba05f class=toggle checked>
<label for=section-b4cfb5b55e913a8d853eacf5e8fba05f class="flex justify-between"><a href=/toml11/ja/docs/features/>features</a></label><ul><li><a href=/toml11/ja/docs/features/parsing_files/>parsing files</a></li><li><a href=/toml11/ja/docs/features/value/>getting values</a></li><li><a href=/toml11/ja/docs/features/error_message/>error message</a></li><li><a href=/toml11/ja/docs/features/serialize/>serializing values</a></li><li><a href=/toml11/ja/docs/features/configure_types/ class=active>configuring types</a></li><li><a href=/toml11/ja/docs/features/literal/>toml literal</a></li><li><a href=/toml11/ja/docs/features/toml_spec/>toml spec</a></li><li><a href=/toml11/ja/docs/features/extension/>extension</a></li></ul></li><li><input type=checkbox id=section-01b096afc5186aea96713b408b47c967 class=toggle>
<label for=section-01b096afc5186aea96713b408b47c967 class="flex justify-between"><a href=/toml11/ja/docs/reference/>reference</a></label><ul><li><a href=/toml11/ja/docs/reference/color/>color.hpp</a></li><li><a href=/toml11/ja/docs/reference/comments/>comments.hpp</a></li><li><a href=/toml11/ja/docs/reference/conversion/>conversion.hpp</a></li><li><a href=/toml11/ja/docs/reference/datetime/>datetime.hpp</a></li><li><a href=/toml11/ja/docs/reference/error_info/>error_info.hpp</a></li><li><a href=/toml11/ja/docs/reference/exception/>exception.hpp</a></li><li><a href=/toml11/ja/docs/reference/find/>find.hpp</a></li><li><a href=/toml11/ja/docs/reference/format/>format.hpp</a></li><li><a href=/toml11/ja/docs/reference/from/>from.hpp</a></li><li><a href=/toml11/ja/docs/reference/get/>get.hpp</a></li><li><a href=/toml11/ja/docs/reference/into/>into.hpp</a></li><li><a href=/toml11/ja/docs/reference/literal/>literal.hpp</a></li><li><a href=/toml11/ja/docs/reference/ordered_map/>ordered_map.hpp</a></li><li><a href=/toml11/ja/docs/reference/parser/>parser.hpp</a></li><li><a href=/toml11/ja/docs/reference/result/>result.hpp</a></li><li><a href=/toml11/ja/docs/reference/serializer/>serializer.hpp</a></li><li><a href=/toml11/ja/docs/reference/source_location/>source_location.hpp</a></li><li><a href=/toml11/ja/docs/reference/spec/>spec.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml_fwd/>toml_fwd.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml/>toml.hpp</a></li><li><a href=/toml11/ja/docs/reference/types/>types.hpp</a></li><li><a href=/toml11/ja/docs/reference/value_t/>value_t.hpp</a></li><li><a href=/toml11/ja/docs/reference/value/>value.hpp</a></li><li><a href=/toml11/ja/docs/reference/version/>version.hpp</a></li><li><a href=/toml11/ja/docs/reference/visit/>visit.hpp</a></li></ul></li><li><a href=/toml11/ja/docs/changelog/>changelog</a><ul></ul></li></ul><ul><li><a href=https://github.com/ToruNiina/toml11 target=_blank rel=noopener>GitHub</a></li></ul></nav><script>(function(){var e=document.querySelector("aside .book-menu-content");addEventListener("beforeunload",function(){localStorage.setItem("menu.scrollTop",e.scrollTop)}),e.scrollTop=localStorage.getItem("menu.scrollTop")})()</script></div></aside><div class=book-page><header class=book-header><div class="flex align-center justify-between"><label for=menu-control><img src=/toml11/svg/menu.svg class=book-icon alt=Menu>
</label><strong>configuring types</strong>
<label for=toc-control><img src=/toml11/svg/toc.svg class=book-icon alt="Table of Contents"></label></div><aside class="hidden clearfix"><nav id=TableOfContents><ul><li><a href=#型をカスタマイズする>型をカスタマイズする</a><ul><li><a href=#type_config><code>type_config</code></a></li><li><a href=#テーブル内の値の順序を維持する>テーブル内の値の順序を維持する</a></li><li><a href=#コメントを保存しない>コメントを保存しない</a></li><li><a href=#配列にstdvector以外のコンテナを使用する>配列に<code>std::vector</code>以外のコンテナを使用する</a></li><li><a href=#数値型に-boostmultiprecision-を使用する>数値型に <code>boost::multiprecision</code> を使用する</a></li></ul></li></ul></nav></aside></header><article class="markdown book-article"><h1 id=型をカスタマイズする>型をカスタマイズする
<a class=anchor href=#%e5%9e%8b%e3%82%92%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba%e3%81%99%e3%82%8b>#</a></h1><p><code>toml::value</code><code>integer_type</code> として <code>std::int64_t</code> を、
<code>table_type</code> として <code>std::unordered_map&lt;key_type, value_type></code> を使用します。</p><p>しかし、場合によっては <code>boost::multiprecision::int128_t</code> や、 <code>std::map</code> を使用したい場合もあります。</p><p>そのため、 <code>toml::value</code><code>template</code> 引数を取って格納する型を変えられるように実装されています。</p><p><code>std::string</code> が実際には <code>std::basic_string&lt;char, std::char_traits&lt;char>, std::allocator&lt;char>></code>
エイリアスであるように、 <code>toml::value</code> は実際には <code>toml::basic_value&lt;toml::type_config></code> のエイリアスです。</p><p>ここでは、 <code>toml::type_config</code> が持つ型と、異なる <code>config</code> 型を定義する方法を説明します。</p><h2 id=type_config><code>type_config</code>
<a class=anchor href=#type_config>#</a></h2><p><code>type_config</code> は、以下のメンバ型と<code>static</code>メンバ関数を持つクラスです。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>namespace</span> toml
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span><span style=color:#66d9ef>struct</span> <span style=color:#a6e22e>type_config</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> comment_type <span style=color:#f92672>=</span> preserve_comments;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> boolean_type <span style=color:#f92672>=</span> <span style=color:#66d9ef>bool</span>;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> integer_type <span style=color:#f92672>=</span> std<span style=color:#f92672>::</span><span style=color:#66d9ef>int64_t</span>;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> floating_type <span style=color:#f92672>=</span> <span style=color:#66d9ef>double</span>;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> string_type <span style=color:#f92672>=</span> std<span style=color:#f92672>::</span>string;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>template</span><span style=color:#f92672>&lt;</span><span style=color:#66d9ef>typename</span> T<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> array_type <span style=color:#f92672>=</span> std<span style=color:#f92672>::</span>vector<span style=color:#f92672>&lt;</span>T<span style=color:#f92672>&gt;</span>;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>template</span><span style=color:#f92672>&lt;</span><span style=color:#66d9ef>typename</span> K, <span style=color:#66d9ef>typename</span> T<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> table_type <span style=color:#f92672>=</span> std<span style=color:#f92672>::</span>unordered_map<span style=color:#f92672>&lt;</span>K, T<span style=color:#f92672>&gt;</span>;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>static</span> result<span style=color:#f92672>&lt;</span>integer_type, error_info<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> parse_int(<span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span>string<span style=color:#f92672>&amp;</span> str, <span style=color:#66d9ef>const</span> source_location src, <span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span><span style=color:#66d9ef>uint8_t</span> base);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>static</span> result<span style=color:#f92672>&lt;</span>floating_type, error_info<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> parse_float(<span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span>string<span style=color:#f92672>&amp;</span> str, <span style=color:#66d9ef>const</span> source_location src, <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>bool</span> is_hex);
</span></span><span style=display:flex><span>};
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p><code>toml::basic_value&lt;TypeConfig></code> は、格納する <code>boolean_type</code><code>TypeConfig::boolean_type</code>
格納する <code>integer_type</code><code>TypeConfig::integer_type</code> 、のようにして定義しています。</p><p>また、 <code>array_type</code><code>TypeConfig::array_type&lt;toml::basic_value&lt;TypeConfig>></code>
<code>table_type</code><code>TypeConfig::table_type&lt;key_type, toml::basic_value&lt;TypeConfig>></code>
定義されます。</p><p>これらのメンバ型とメンバ関数を定義したクラスを <code>toml::basic_value</code>
渡すことで、その <code>toml::basic_value</code> が持つ型を変更できます。</p><p><code>parse_int</code><code>parse_float</code> は、数値型を独自実装のものに変更した際にパース方法を提供するための関数です。
これらの関数には <code>0x</code> などのprefixと桁区切りの <code>_</code> が取り除かれた文字列、
例えば <code>123456</code><code>DEADBEEF</code> が渡されます。
<code>base</code> には <code>10</code>, <code>16</code>, <code>8</code>, <code>2</code> のいずれかが渡されます。
これらを使って <code>integer_type</code><code>floating_type</code> をパース出来るような関数を渡してください。</p><p>デフォルト実装として、<code>toml::read_int</code><code>toml::read_float</code> が提供されています。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>static</span> result<span style=color:#f92672>&lt;</span>integer_type, error_info<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span>parse_int(<span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span>string<span style=color:#f92672>&amp;</span> str, <span style=color:#66d9ef>const</span> source_location src, <span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span><span style=color:#66d9ef>uint8_t</span> base)
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> toml<span style=color:#f92672>::</span>read_int<span style=color:#f92672>&lt;</span>integer_type<span style=color:#f92672>&gt;</span>(str, src, base);
</span></span><span style=display:flex><span>}
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>static</span> result<span style=color:#f92672>&lt;</span>floating_type, error_info<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span>parse_float(<span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span>string<span style=color:#f92672>&amp;</span> str, <span style=color:#66d9ef>const</span> source_location src, <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>bool</span> is_hex)
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> toml<span style=color:#f92672>::</span>read_float<span style=color:#f92672>&lt;</span>floating_type<span style=color:#f92672>&gt;</span>(str, src, is_hex);
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p><code>read_int</code><code>istream</code> を使用し、16進と8進の場合は <code>std::hex</code>
<code>std::oct</code> を使用します。2進の場合は掛け算と足し算で実装されています。
これらをサポートしている型であれば、 <code>read_int</code> をそのまま使用できます。</p><p><code>read_float</code><code>istream</code> を使用します。
16進浮動小数点数は <code>double</code><code>float</code> の場合しかサポートされておらず、
それ以外の型のときに呼ばれると常にパースエラーを返す実装になっているので、
もし浮動小数点数型をこれら以外の型にし、かつ <code>hexfloat</code> を使用する場合は、
それを実装してください。 <code>hexfloat</code> を使用しないのであれば、実装する必要はありません。</p><h2 id=テーブル内の値の順序を維持する>テーブル内の値の順序を維持する
<a class=anchor href=#%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e5%86%85%e3%81%ae%e5%80%a4%e3%81%ae%e9%a0%86%e5%ba%8f%e3%82%92%e7%b6%ad%e6%8c%81%e3%81%99%e3%82%8b>#</a></h2><p>デフォルトの <code>toml::type_config</code> の他に、 <code>toml::ordered_type_config</code> が提供されています。
これは、 <code>table_type</code><a href=https://toruniina.github.io/toml11/ja/docs/reference/ordered_map/>ordered_map</a> に変更したものです。</p><p>これを使用したものを <code>toml::ordered_value</code> 、その配列型とテーブル型のエイリアスを
<code>toml::ordered_array</code><code>toml::ordered_table</code> と定義しています。</p><p><code>toml::parse(...)</code><code>toml::parse&lt;toml::ordered_type_config>(...)</code> として呼び出すことで、
<code>toml::ordered_value</code> を使用することができます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> toml<span style=color:#f92672>::</span>ordered_value input <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse<span style=color:#f92672>&lt;</span>toml<span style=color:#f92672>::</span>ordered_type_config<span style=color:#f92672>&gt;</span>(<span style=color:#e6db74>&#34;example.toml&#34;</span>);
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> toml<span style=color:#f92672>::</span>format(input) <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h2 id=コメントを保存しない>コメントを保存しない
<a class=anchor href=#%e3%82%b3%e3%83%a1%e3%83%b3%e3%83%88%e3%82%92%e4%bf%9d%e5%ad%98%e3%81%97%e3%81%aa%e3%81%84>#</a></h2><p><code>type_config</code><code>comment_type</code> でコメントを保存するコンテナを定義しています。</p><p>コメントに特に情報がなく、パースせずに捨ててしまっていい場合は、 <code>comment_type</code>
<code>toml::discard_comments</code> を指定してください。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>struct</span> <span style=color:#a6e22e>wo_comment_config</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> comment_type <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>discard_comments; <span style=color:#75715e>// XXX
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> boolean_type <span style=color:#f92672>=</span> <span style=color:#66d9ef>bool</span>;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> integer_type <span style=color:#f92672>=</span> std<span style=color:#f92672>::</span><span style=color:#66d9ef>int64_t</span>;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> floating_type <span style=color:#f92672>=</span> <span style=color:#66d9ef>double</span>;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> string_type <span style=color:#f92672>=</span> std<span style=color:#f92672>::</span>string;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>template</span><span style=color:#f92672>&lt;</span><span style=color:#66d9ef>typename</span> T<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> array_type <span style=color:#f92672>=</span> std<span style=color:#f92672>::</span>vector<span style=color:#f92672>&lt;</span>T<span style=color:#f92672>&gt;</span>;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>template</span><span style=color:#f92672>&lt;</span><span style=color:#66d9ef>typename</span> K, <span style=color:#66d9ef>typename</span> T<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> table_type <span style=color:#f92672>=</span> std<span style=color:#f92672>::</span>unordered_map<span style=color:#f92672>&lt;</span>K, T<span style=color:#f92672>&gt;</span>;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>static</span> result<span style=color:#f92672>&lt;</span>integer_type, error_info<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> parse_int(<span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span>string<span style=color:#f92672>&amp;</span> str, <span style=color:#66d9ef>const</span> source_location src, <span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span><span style=color:#66d9ef>uint8_t</span> base)
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> toml<span style=color:#f92672>::</span>read_int<span style=color:#f92672>&lt;</span>integer_type<span style=color:#f92672>&gt;</span>(str, src, base);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>static</span> result<span style=color:#f92672>&lt;</span>floating_type, error_info<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> parse_float(<span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span>string<span style=color:#f92672>&amp;</span> str, <span style=color:#66d9ef>const</span> source_location src, <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>bool</span> is_hex)
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> toml<span style=color:#f92672>::</span>read_float<span style=color:#f92672>&lt;</span>floating_type<span style=color:#f92672>&gt;</span>(str, src, is_hex);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>};
</span></span></code></pre></div><h2 id=配列にstdvector以外のコンテナを使用する>配列に<code>std::vector</code>以外のコンテナを使用する
<a class=anchor href=#%e9%85%8d%e5%88%97%e3%81%abstdvector%e4%bb%a5%e5%a4%96%e3%81%ae%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%99%e3%82%8b>#</a></h2><p>TOML配列の実装に<code>vector</code>以外のコンテナ(例:<code>std::deque</code>)を使用するには、
<code>array_type</code> を以下のように変更してください。</p><p>また、テーブル型のコンテナに <code>unordered_map</code> 以外のコンテナ(例:<code>std::map</code>)を使用するには、
<code>table_type</code> を以下のように変更してください。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>struct</span> <span style=color:#a6e22e>deque_map_config</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> comment_type <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>preserve_comments;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> boolean_type <span style=color:#f92672>=</span> <span style=color:#66d9ef>bool</span>;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> integer_type <span style=color:#f92672>=</span> std<span style=color:#f92672>::</span><span style=color:#66d9ef>int64_t</span>;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> floating_type <span style=color:#f92672>=</span> <span style=color:#66d9ef>double</span>;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> string_type <span style=color:#f92672>=</span> std<span style=color:#f92672>::</span>string;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>template</span><span style=color:#f92672>&lt;</span><span style=color:#66d9ef>typename</span> T<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> array_type <span style=color:#f92672>=</span> std<span style=color:#f92672>::</span>deque<span style=color:#f92672>&lt;</span>T<span style=color:#f92672>&gt;</span>; <span style=color:#75715e>// XXX
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#66d9ef>template</span><span style=color:#f92672>&lt;</span><span style=color:#66d9ef>typename</span> K, <span style=color:#66d9ef>typename</span> T<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> table_type <span style=color:#f92672>=</span> std<span style=color:#f92672>::</span>map<span style=color:#f92672>&lt;</span>K, T<span style=color:#f92672>&gt;</span>; <span style=color:#75715e>// XXX
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>static</span> result<span style=color:#f92672>&lt;</span>integer_type, error_info<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> parse_int(<span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span>string<span style=color:#f92672>&amp;</span> str, <span style=color:#66d9ef>const</span> source_location src, <span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span><span style=color:#66d9ef>uint8_t</span> base)
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> toml<span style=color:#f92672>::</span>read_int<span style=color:#f92672>&lt;</span>integer_type<span style=color:#f92672>&gt;</span>(str, src, base);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>static</span> result<span style=color:#f92672>&lt;</span>floating_type, error_info<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> parse_float(<span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span>string<span style=color:#f92672>&amp;</span> str, <span style=color:#66d9ef>const</span> source_location src, <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>bool</span> is_hex)
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> toml<span style=color:#f92672>::</span>read_float<span style=color:#f92672>&lt;</span>floating_type<span style=color:#f92672>&gt;</span>(str, src, is_hex);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>};
</span></span></code></pre></div><h2 id=数値型に-boostmultiprecision-を使用する>数値型に <code>boost::multiprecision</code> を使用する
<a class=anchor href=#%e6%95%b0%e5%80%a4%e5%9e%8b%e3%81%ab-boostmultiprecision-%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%99%e3%82%8b>#</a></h2><p><code>boost::multiprecision::cpp_int</code><code>boost::multiprecision::cpp_bin_float_oct</code>
を使用することで、より幅の広い整数型とより精度の良い浮動小数点数型を使用することができます。</p><p>これらの型はストリーム演算子を実装しているため、デフォルト実装の <code>read_int</code>
<code>read_float</code> をそのまま使用できます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>struct</span> <span style=color:#a6e22e>large_num_config</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> comment_type <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>preserve_comments;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> boolean_type <span style=color:#f92672>=</span> <span style=color:#66d9ef>bool</span>;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> integer_type <span style=color:#f92672>=</span> boost<span style=color:#f92672>::</span>multiprecision<span style=color:#f92672>::</span>cpp_int;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> floating_type <span style=color:#f92672>=</span> boost<span style=color:#f92672>::</span>multiprecision<span style=color:#f92672>::</span>cpp_bin_float_oct;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> string_type <span style=color:#f92672>=</span> std<span style=color:#f92672>::</span>string;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>template</span><span style=color:#f92672>&lt;</span><span style=color:#66d9ef>typename</span> T<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> array_type <span style=color:#f92672>=</span> std<span style=color:#f92672>::</span>vector<span style=color:#f92672>&lt;</span>T<span style=color:#f92672>&gt;</span>;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>template</span><span style=color:#f92672>&lt;</span><span style=color:#66d9ef>typename</span> K, <span style=color:#66d9ef>typename</span> T<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> table_type <span style=color:#f92672>=</span> std<span style=color:#f92672>::</span>unordered_map<span style=color:#f92672>&lt;</span>K, T<span style=color:#f92672>&gt;</span>;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>static</span> toml<span style=color:#f92672>::</span>result<span style=color:#f92672>&lt;</span>integer_type, toml<span style=color:#f92672>::</span>error_info<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> parse_int(<span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span>string<span style=color:#f92672>&amp;</span> str, <span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>source_location src, <span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span><span style=color:#66d9ef>uint8_t</span> base)
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> toml<span style=color:#f92672>::</span>read_int<span style=color:#f92672>&lt;</span>integer_type<span style=color:#f92672>&gt;</span>(str, src, base);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>static</span> toml<span style=color:#f92672>::</span>result<span style=color:#f92672>&lt;</span>floating_type, toml<span style=color:#f92672>::</span>error_info<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> parse_float(<span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span>string<span style=color:#f92672>&amp;</span> str, <span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>source_location src, <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>bool</span> is_hex)
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> toml<span style=color:#f92672>::</span>read_float<span style=color:#f92672>&lt;</span>floating_type<span style=color:#f92672>&gt;</span>(str, src, is_hex);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>};
</span></span></code></pre></div></article><footer class=book-footer><div class="flex flex-wrap justify-between"></div><script>(function(){function e(e){const t=window.getSelection(),n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}document.querySelectorAll("pre code").forEach(t=>{t.addEventListener("click",function(){if(window.getSelection().toString())return;e(t.parentElement),navigator.clipboard&&navigator.clipboard.writeText(t.parentElement.textContent)})})})()</script></footer><label for=menu-control class="hidden book-menu-overlay"></label></div><aside class=book-toc><div class=book-toc-content><nav id=TableOfContents><ul><li><a href=#型をカスタマイズする>型をカスタマイズする</a><ul><li><a href=#type_config><code>type_config</code></a></li><li><a href=#テーブル内の値の順序を維持する>テーブル内の値の順序を維持する</a></li><li><a href=#コメントを保存しない>コメントを保存しない</a></li><li><a href=#配列にstdvector以外のコンテナを使用する>配列に<code>std::vector</code>以外のコンテナを使用する</a></li><li><a href=#数値型に-boostmultiprecision-を使用する>数値型に <code>boost::multiprecision</code> を使用する</a></li></ul></li></ul></nav></div></aside></main></body></html>

View File

@@ -0,0 +1,157 @@
<!doctype html><html lang=ja dir=ltr><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="
エラーメッセージを出力する
#
toml11は toml::parse や toml::get<T>/find<T>, as_integer() などから
ファイル内の位置情報を含んだエラーメッセージを出力します。
例えば、パース時に整数の文法エラーを発見した場合、
[error] bad integer: `_` must be surrounded by digits
--> internal string at line 64 in file main.cpp
|
1 | a = 123__456
| ^-- invalid underscore
Hint: valid : -42, 1_000, 1_2_3_4_5, 0xC0FFEE, 0b0010, 0o755
Hint: invalid: _42, 1__000, 0123
あるいは実際に格納されている型と異なる型を要求した場合
[error] toml::value::as_string(): bad_cast to string
--> input.toml
|
1 | a = 123_456
| ^^^^^^^-- the actual type is integer
toml11は toml::value からこのようなエラーメッセージを作成する方法を提供します。"><meta name=theme-color media="(prefers-color-scheme: light)" content="#ffffff"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#343a40"><meta name=color-scheme content="light dark"><meta property="og:url" content="https://toruniina.github.io/toml11/ja/docs/features/error_message/"><meta property="og:site_name" content="toml11"><meta property="og:title" content="error message"><meta property="og:description" content="エラーメッセージを出力する # toml11は toml::parse や toml::get<T>/find<T>, as_integer() などから ファイル内の位置情報を含んだエラーメッセージを出力します。
例えば、パース時に整数の文法エラーを発見した場合、
[error] bad integer: `_` must be surrounded by digits --> internal string at line 64 in file main.cpp | 1 | a = 123__456 | ^-- invalid underscore Hint: valid : -42, 1_000, 1_2_3_4_5, 0xC0FFEE, 0b0010, 0o755 Hint: invalid: _42, 1__000, 0123 あるいは実際に格納されている型と異なる型を要求した場合
[error] toml::value::as_string(): bad_cast to string --> input.toml | 1 | a = 123_456 | ^^^^^^^-- the actual type is integer toml11は toml::value からこのようなエラーメッセージを作成する方法を提供します。"><meta property="og:locale" content="ja"><meta property="og:type" content="article"><meta property="article:section" content="docs"><title>error message | toml11</title>
<link rel=manifest href=/toml11/manifest.json><link rel=icon href=/toml11/favicon.png><link rel=canonical href=https://toruniina.github.io/toml11/ja/docs/features/error_message/><link rel=alternate hreflang=en href=https://toruniina.github.io/toml11/docs/features/error_message/ title="error message"><link rel=stylesheet href=/toml11/book.min.ddac3efe7ea4c1007ff53e5a8fd67f12517e5d2e99984d8c67a18668f7ecaa03.css integrity="sha256-3aw+/n6kwQB/9T5aj9Z/ElF+XS6ZmE2MZ6GGaPfsqgM=" crossorigin=anonymous><script defer src=/toml11/fuse.min.js></script><script defer src=/toml11/ja.search.min.13aefbf6a803b591c02d5bc9a01dfe65fe37c31e2915c91573708d38e805d86c.js integrity="sha256-E6779qgDtZHALVvJoB3+Zf43wx4pFckVc3CNOOgF2Gw=" crossorigin=anonymous></script></head><body dir=ltr><input type=checkbox class="hidden toggle" id=menu-control>
<input type=checkbox class="hidden toggle" id=toc-control><main class="container flex"><aside class=book-menu><div class=book-menu-content><nav><h2 class=book-brand><a class="flex align-center" href=/toml11/ja/><span>toml11</span></a></h2><div class="book-search hidden"><input type=text id=book-search-input placeholder=検索 aria-label=検索 maxlength=64 data-hotkeys=s/><div class="book-search-spinner hidden"></div><ul id=book-search-results></ul></div><script>document.querySelector(".book-search").classList.remove("hidden")</script><ul class=book-languages><li><input type=checkbox id=languages class=toggle>
<label for=languages class="flex justify-between"><a role=button class="flex align-center"><img src=/toml11/svg/translate.svg class=book-icon alt=Languages>
日本語</a></label><ul><li><a href=https://toruniina.github.io/toml11/docs/features/error_message/>English</a></li></ul></li></ul><ul><li><a href=/toml11/ja/docs/installation/>installation</a><ul></ul></li><li><input type=checkbox id=section-b4cfb5b55e913a8d853eacf5e8fba05f class=toggle checked>
<label for=section-b4cfb5b55e913a8d853eacf5e8fba05f class="flex justify-between"><a href=/toml11/ja/docs/features/>features</a></label><ul><li><a href=/toml11/ja/docs/features/parsing_files/>parsing files</a></li><li><a href=/toml11/ja/docs/features/value/>getting values</a></li><li><a href=/toml11/ja/docs/features/error_message/ class=active>error message</a></li><li><a href=/toml11/ja/docs/features/serialize/>serializing values</a></li><li><a href=/toml11/ja/docs/features/configure_types/>configuring types</a></li><li><a href=/toml11/ja/docs/features/literal/>toml literal</a></li><li><a href=/toml11/ja/docs/features/toml_spec/>toml spec</a></li><li><a href=/toml11/ja/docs/features/extension/>extension</a></li></ul></li><li><input type=checkbox id=section-01b096afc5186aea96713b408b47c967 class=toggle>
<label for=section-01b096afc5186aea96713b408b47c967 class="flex justify-between"><a href=/toml11/ja/docs/reference/>reference</a></label><ul><li><a href=/toml11/ja/docs/reference/color/>color.hpp</a></li><li><a href=/toml11/ja/docs/reference/comments/>comments.hpp</a></li><li><a href=/toml11/ja/docs/reference/conversion/>conversion.hpp</a></li><li><a href=/toml11/ja/docs/reference/datetime/>datetime.hpp</a></li><li><a href=/toml11/ja/docs/reference/error_info/>error_info.hpp</a></li><li><a href=/toml11/ja/docs/reference/exception/>exception.hpp</a></li><li><a href=/toml11/ja/docs/reference/find/>find.hpp</a></li><li><a href=/toml11/ja/docs/reference/format/>format.hpp</a></li><li><a href=/toml11/ja/docs/reference/from/>from.hpp</a></li><li><a href=/toml11/ja/docs/reference/get/>get.hpp</a></li><li><a href=/toml11/ja/docs/reference/into/>into.hpp</a></li><li><a href=/toml11/ja/docs/reference/literal/>literal.hpp</a></li><li><a href=/toml11/ja/docs/reference/ordered_map/>ordered_map.hpp</a></li><li><a href=/toml11/ja/docs/reference/parser/>parser.hpp</a></li><li><a href=/toml11/ja/docs/reference/result/>result.hpp</a></li><li><a href=/toml11/ja/docs/reference/serializer/>serializer.hpp</a></li><li><a href=/toml11/ja/docs/reference/source_location/>source_location.hpp</a></li><li><a href=/toml11/ja/docs/reference/spec/>spec.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml_fwd/>toml_fwd.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml/>toml.hpp</a></li><li><a href=/toml11/ja/docs/reference/types/>types.hpp</a></li><li><a href=/toml11/ja/docs/reference/value_t/>value_t.hpp</a></li><li><a href=/toml11/ja/docs/reference/value/>value.hpp</a></li><li><a href=/toml11/ja/docs/reference/version/>version.hpp</a></li><li><a href=/toml11/ja/docs/reference/visit/>visit.hpp</a></li></ul></li><li><a href=/toml11/ja/docs/changelog/>changelog</a><ul></ul></li></ul><ul><li><a href=https://github.com/ToruNiina/toml11 target=_blank rel=noopener>GitHub</a></li></ul></nav><script>(function(){var e=document.querySelector("aside .book-menu-content");addEventListener("beforeunload",function(){localStorage.setItem("menu.scrollTop",e.scrollTop)}),e.scrollTop=localStorage.getItem("menu.scrollTop")})()</script></div></aside><div class=book-page><header class=book-header><div class="flex align-center justify-between"><label for=menu-control><img src=/toml11/svg/menu.svg class=book-icon alt=Menu>
</label><strong>error message</strong>
<label for=toc-control><img src=/toml11/svg/toc.svg class=book-icon alt="Table of Contents"></label></div><aside class="hidden clearfix"><nav id=TableOfContents><ul><li><a href=#エラーメッセージを出力する>エラーメッセージを出力する</a><ul><li><a href=#tomlvalue-の位置情報からエラーメッセージを作成する><code>toml::value</code> の位置情報からエラーメッセージを作成する</a></li><li><a href=#文字列に色を付ける>文字列に色を付ける</a></li><li><a href=#エラーメッセージのprefixをerrorから変更する>エラーメッセージのprefixを<code>[error]</code>から変更する</a></li><li><a href=#複数の-tomlvalue-を指すエラーメッセージを作成する>複数の <code>toml::value</code> を指すエラーメッセージを作成する</a></li></ul></li></ul></nav></aside></header><article class="markdown book-article"><h1 id=エラーメッセージを出力する>エラーメッセージを出力する
<a class=anchor href=#%e3%82%a8%e3%83%a9%e3%83%bc%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e3%82%92%e5%87%ba%e5%8a%9b%e3%81%99%e3%82%8b>#</a></h1><p>toml11は <code>toml::parse</code><code>toml::get&lt;T>/find&lt;T></code>, <code>as_integer()</code> などから
ファイル内の位置情報を含んだエラーメッセージを出力します。</p><p>例えば、パース時に整数の文法エラーを発見した場合、</p><pre tabindex=0><code>[error] bad integer: `_` must be surrounded by digits
--&gt; internal string at line 64 in file main.cpp
|
1 | a = 123__456
| ^-- invalid underscore
Hint: valid : -42, 1_000, 1_2_3_4_5, 0xC0FFEE, 0b0010, 0o755
Hint: invalid: _42, 1__000, 0123
</code></pre><p>あるいは実際に格納されている型と異なる型を要求した場合</p><pre tabindex=0><code>[error] toml::value::as_string(): bad_cast to string
--&gt; input.toml
|
1 | a = 123_456
| ^^^^^^^-- the actual type is integer
</code></pre><p>toml11は <code>toml::value</code> からこのようなエラーメッセージを作成する方法を提供します。</p><p>この機能を利用することで、TOMLの文法エラーだけでなく、
例えば正の値でなければならないところに負数が現れた場合などの
アプリケーション固有のエラーメッセージを、TOMLファイル内の位置を指摘しながら
ユーザーに伝えられるということです。</p><h2 id=tomlvalue-の位置情報からエラーメッセージを作成する><code>toml::value</code> の位置情報からエラーメッセージを作成する
<a class=anchor href=#tomlvalue-%e3%81%ae%e4%bd%8d%e7%bd%ae%e6%83%85%e5%a0%b1%e3%81%8b%e3%82%89%e3%82%a8%e3%83%a9%e3%83%bc%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b>#</a></h2><p><code>toml::value</code> はそれがパースされた位置の情報を持っています。</p><p>その情報は <code>toml::source_location</code> にまとめられ、<code>toml::value::location()</code> で取得できます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>&amp;</span> a <span style=color:#f92672>=</span> input.at(<span style=color:#e6db74>&#34;a&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>source_location src <span style=color:#f92672>=</span> a.location();
</span></span></code></pre></div><p>ファイルを <code>toml::parse</code> でパースした場合、そのTOMLファイル名と行数が保存されています。</p><p><code>toml::parse_str</code> でパースした場合TOMLファイル名はありませんが、代わりに
<code>toml::parse_str</code> を呼び出したC++ソースコードのファイル名と行数がTOMLファイル名として保存されています。
このページの最初の例は <code>toml::parse_str</code> から出力された例でした。
ファイル名の部分に注目してください。</p><p>詳細は <a href=https://toruniina.github.io/toml11/ja/docs/reference/source_location/>reference</a> を参照してください。</p><p><code>toml::source_location</code> または <code>toml::value</code> とそれに付随するエラーメッセージを
<code>toml::make_error_info</code> に渡すことで、エラー情報を構築できます。
これを<code>toml::format_error</code> に渡すと、エラーメッセージが <code>std::string</code> にフォーマットされます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>&amp;</span> a <span style=color:#f92672>=</span> input.at(<span style=color:#e6db74>&#34;a&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#66d9ef>if</span>(a.as_integer() <span style=color:#f92672>&lt;</span> <span style=color:#ae81ff>0</span>)
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>error_info err <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>make_error_info(
</span></span><span style=display:flex><span> <span style=color:#e6db74>&#34;positive integer is required&#34;</span>, <span style=color:#75715e>// エラーのタイトル
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> a, <span style=color:#e6db74>&#34;but got negative value&#34;</span> <span style=color:#75715e>// 値の横に書くメッセージ
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> );
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cerr <span style=color:#f92672>&lt;&lt;</span> toml<span style=color:#f92672>::</span>format_error(err) <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>これは以下のようになります。</p><pre tabindex=0><code>[error] positive integer is required
--&gt; input.toml
|
1 | a = -123456
| ^^^^^^^-- but got negative value
</code></pre><p>最後に補足をつけ足すこともできます。これはインデントされません。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>&amp;</span> a <span style=color:#f92672>=</span> input.at(<span style=color:#e6db74>&#34;a&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#66d9ef>if</span>(a.as_integer() <span style=color:#f92672>&lt;</span> <span style=color:#ae81ff>0</span>)
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>error_info err <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>make_error_info(
</span></span><span style=display:flex><span> <span style=color:#e6db74>&#34;positive integer is required&#34;</span>, <span style=color:#75715e>// エラーのタイトル
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> a, <span style=color:#e6db74>&#34;but got negative value&#34;</span>, <span style=color:#75715e>// 値の横に書くメッセージ
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#e6db74>&#34;Hint: `a` means length of the data&#34;</span> <span style=color:#75715e>// 補足
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> );
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cerr <span style=color:#f92672>&lt;&lt;</span> toml<span style=color:#f92672>::</span>format_error(err) <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><pre tabindex=0><code>[error] positive integer is required
--&gt; input.toml
|
1 | a = -123456
| ^^^^^^^-- but got negative value
Hint: `a` means length of the data
</code></pre><blockquote class="book-hint info"><p><code>toml::value</code> からファイル内の行を出力できるのは、
パースしたファイルが文字列としてメモリの中に残されているからです。</p><p>パースした文字列はその全体が <code>std::shared_ptr</code><code>toml::value</code> に共有されています。
コピーしてもファイル文字列全体がコピーされることはありません。
また、そのファイルをパースして構築された <code>toml::value</code> が全てデストラクトされた時点で、
ファイル情報もメモリ上から解放されます。</p><p>ですので、アプリケーションで使用する際には、 <code>toml::value</code> を直接保存するのではなく
読み込み中に必要な値を全て取り出して、変換した値を保存した方がよいでしょう。</p></blockquote><h2 id=文字列に色を付ける>文字列に色を付ける
<a class=anchor href=#%e6%96%87%e5%ad%97%e5%88%97%e3%81%ab%e8%89%b2%e3%82%92%e4%bb%98%e3%81%91%e3%82%8b>#</a></h2><p>エラーメッセージにはANSIエスケープコードを使って色を付けることができます。</p><p><code>TOML11_COLORIZE_ERROR_MESSAGE</code> をコンパイル時に定義していれば、
toml11の出力するエラーメッセージはデフォルトで色が付くようになります。</p><p>そうでない場合は、 <code>toml::color::enable()</code> を呼び出すことにより、それ以降で出力される
エラーメッセージには色が付くようになります。
逆に出力先がコンソールではないなどの理由で色をつけたくない場合は、
<code>toml::color::disable()</code> を呼び出してください。
その時点で色が付くようになっているかどうかは、
<code>toml::color::should_color()</code> の返り値で判定できます。</p><p>詳細は <a href=https://toruniina.github.io/toml11/ja/docs/reference/color/>reference</a> を参照してください。</p><p>また、エラーのタイトルやエラーメッセージ、補足にはデフォルトで色が付きませんが、
<code>toml::color</code> にあるマニピュレータを使って色を付けることも可能です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>std<span style=color:#f92672>::</span>ostringstream oss;
</span></span><span style=display:flex><span>oss <span style=color:#f92672>&lt;&lt;</span> toml<span style=color:#f92672>::</span>color<span style=color:#f92672>::</span>red <span style=color:#f92672>&lt;&lt;</span> <span style=color:#e6db74>&#34;but got negative value&#34;</span>;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>error_info err <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>make_error_info(
</span></span><span style=display:flex><span> <span style=color:#e6db74>&#34;positive integer is required&#34;</span>, <span style=color:#75715e>// Error title
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> a, oss.str(), <span style=color:#75715e>// Message next to the value
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#e6db74>&#34;Hint: `a` means length of the data&#34;</span> <span style=color:#75715e>// Supplementary message
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> );
</span></span></code></pre></div><p>こちらも、詳細は <a href=https://toruniina.github.io/toml11/ja/docs/reference/color/>reference</a> を参照してください。</p><h2 id=エラーメッセージのprefixをerrorから変更する>エラーメッセージのprefixを<code>[error]</code>から変更する
<a class=anchor href=#%e3%82%a8%e3%83%a9%e3%83%bc%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e3%81%aeprefix%e3%82%92error%e3%81%8b%e3%82%89%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b>#</a></h2><p>エラーには種類があり、デフォルトの <code>[error]</code> ではよくない場合もあるでしょう。</p><p><code>toml::format_error</code> では、 <code>toml::error_info</code> の前に <code>std::string</code> を取って、それを
<code>[error]</code> の代わりに出力することができます。</p><p>例えば、</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>&amp;</span> a <span style=color:#f92672>=</span> input.at(<span style=color:#e6db74>&#34;a&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#66d9ef>if</span>(a.as_integer() <span style=color:#f92672>&lt;</span> <span style=color:#ae81ff>0</span>)
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>error_info err <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>make_error_info(
</span></span><span style=display:flex><span> <span style=color:#e6db74>&#34;positive integer is required&#34;</span>, <span style=color:#75715e>// エラーのタイトル
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> a, <span style=color:#e6db74>&#34;but got negative value&#34;</span> <span style=color:#75715e>// 値の横に書くメッセージ
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> );
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>ostringstream prefix;
</span></span><span style=display:flex><span> prefix <span style=color:#f92672>&lt;&lt;</span> toml<span style=color:#f92672>::</span>color<span style=color:#f92672>::</span>bold <span style=color:#f92672>&lt;&lt;</span> toml<span style=color:#f92672>::</span>color<span style=color:#f92672>::</span>yellow <span style=color:#f92672>&lt;&lt;</span> <span style=color:#e6db74>&#34;[warn]&#34;</span>;
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cerr <span style=color:#f92672>&lt;&lt;</span> toml<span style=color:#f92672>::</span>format_error(prefix.str(), err) <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span><span style=display:flex><span><span style=color:#66d9ef>else</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> a.as_integer()
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>このようにすると、 <code>[warn]</code> から始まる警告を出力することができます。</p><p>他にも、<code>toml::format_error</code> に直接 <code>error_info</code> の構成要素を渡すことで、
<code>[error]</code> なしのエラーメッセージを作成できます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>&amp;</span> a <span style=color:#f92672>=</span> input.at(<span style=color:#e6db74>&#34;a&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#66d9ef>if</span>(a.as_integer() <span style=color:#f92672>&lt;</span> <span style=color:#ae81ff>0</span>)
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cerr <span style=color:#f92672>&lt;&lt;</span> toml<span style=color:#f92672>::</span>format_error(
</span></span><span style=display:flex><span> <span style=color:#e6db74>&#34;[warn] positive integer is required&#34;</span>, <span style=color:#75715e>// エラーのタイトル
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> a, <span style=color:#e6db74>&#34;but got negative value&#34;</span> <span style=color:#75715e>// 値の横に書くメッセージ
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> ) <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span><span style=display:flex><span><span style=color:#66d9ef>else</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> a.as_integer()
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h2 id=複数の-tomlvalue-を指すエラーメッセージを作成する>複数の <code>toml::value</code> を指すエラーメッセージを作成する
<a class=anchor href=#%e8%a4%87%e6%95%b0%e3%81%ae-tomlvalue-%e3%82%92%e6%8c%87%e3%81%99%e3%82%a8%e3%83%a9%e3%83%bc%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b>#</a></h2><p>アプリケーションの設定では、先に読み込んだ値によって後に読み込んだ値が取れる範囲が変わることがあるでしょう。</p><p>そのような場合には、エラーの原因となる別の値を同時に出力したいはずです。</p><p><code>toml::format_error</code><code>toml::make_error_info</code> は、 <code>toml::value</code> とそれに対応するエラーメッセージ <code>std::string</code> のペアを任意個取ることができます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>std<span style=color:#f92672>::</span>cerr <span style=color:#f92672>&lt;&lt;</span> toml<span style=color:#f92672>::</span>format_error(
</span></span><span style=display:flex><span> <span style=color:#e6db74>&#34;[error] invalid range&#34;</span>,
</span></span><span style=display:flex><span> a, <span style=color:#e6db74>&#34;minimum value is defined here&#34;</span>,
</span></span><span style=display:flex><span> b, <span style=color:#e6db74>&#34;maximum value is defined here&#34;</span>,
</span></span><span style=display:flex><span> c, <span style=color:#e6db74>&#34;and it exceeds the range&#34;</span>
</span></span><span style=display:flex><span> ) <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span></code></pre></div><p>こちらも末尾に補足を追加することができます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>std<span style=color:#f92672>::</span>cerr <span style=color:#f92672>&lt;&lt;</span> toml<span style=color:#f92672>::</span>format_error(
</span></span><span style=display:flex><span> <span style=color:#e6db74>&#34;[error] invalid range&#34;</span>,
</span></span><span style=display:flex><span> a, <span style=color:#e6db74>&#34;minimum value is defined here&#34;</span>,
</span></span><span style=display:flex><span> b, <span style=color:#e6db74>&#34;maximum value is defined here&#34;</span>,
</span></span><span style=display:flex><span> c, <span style=color:#e6db74>&#34;and it exceeds the range&#34;</span>,
</span></span><span style=display:flex><span> <span style=color:#e6db74>&#34;Hint: all the value must be in the range, [a, b)&#34;</span>
</span></span><span style=display:flex><span> ) <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span></code></pre></div><p><code>toml::value</code> または <code>toml::source_location</code> を渡した場合、必ずそれに関する
エラーメッセージが続く必要があります。
そうしない場合、非常にわかりにくいコンパイルエラーになります。</p></article><footer class=book-footer><div class="flex flex-wrap justify-between"></div><script>(function(){function e(e){const t=window.getSelection(),n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}document.querySelectorAll("pre code").forEach(t=>{t.addEventListener("click",function(){if(window.getSelection().toString())return;e(t.parentElement),navigator.clipboard&&navigator.clipboard.writeText(t.parentElement.textContent)})})})()</script></footer><label for=menu-control class="hidden book-menu-overlay"></label></div><aside class=book-toc><div class=book-toc-content><nav id=TableOfContents><ul><li><a href=#エラーメッセージを出力する>エラーメッセージを出力する</a><ul><li><a href=#tomlvalue-の位置情報からエラーメッセージを作成する><code>toml::value</code> の位置情報からエラーメッセージを作成する</a></li><li><a href=#文字列に色を付ける>文字列に色を付ける</a></li><li><a href=#エラーメッセージのprefixをerrorから変更する>エラーメッセージのprefixを<code>[error]</code>から変更する</a></li><li><a href=#複数の-tomlvalue-を指すエラーメッセージを作成する>複数の <code>toml::value</code> を指すエラーメッセージを作成する</a></li></ul></li></ul></nav></div></aside></main></body></html>

View File

@@ -0,0 +1,133 @@
<!doctype html><html lang=ja dir=ltr><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content='
TOML言語拡張
#
TOML言語は現在 v1.0.0 が最新版ですが、その後もいくつかの新機能が議論の末マージされ、
v1.1.0に向けて議論が続いています。
そこで議論された機能の中には、有用なケースが少ないと考えられたものや、
提案された際の方向性では導入が難しいもの、導入がされなかったものも多くあります。
toml11では、そのような機能のなかからいくつかを選んで、実験的に実装を行っています。
これらはtoml11ではサポートされていますが、他のパーサではサポートされておらず、また
サポートされる予定もないことに注意してください。
また、これらの機能はデフォルトで使用されない設定になっており、
使用するためには機能フラグをそれぞれ true にしなければなりません。
非標準の機能なので、あえて明示的に書かなければ使えないように設計しています。
いくつかの機能は今後TOML言語自体に新機能としてマージされる可能性があります。
もし以下の拡張機能を完全に置き換えられる機能が導入された場合、拡張機能は
本来の機能の実装後にマイナーバージョンアップで削除される可能性があります。
null
#
TOMLファイル内で値としてnullを使えるようになります。
a = null
b = [ 1, 2, 3, null, 5]
これを使用するには、 toml::spec の ext_null_value を true にします。
パースすると、デフォルト構築した場合と同様の toml::value_t::empty となります。
ただし、ファイル内の位置情報は設定されます。
null は値の文脈でのみパースされるので、キーに null を使用した際はこれまで通り
"null" という文字列のキーとして解釈されます。
#include <toml.hpp>
int main()
{
toml::spec spec;
spec.ext_null_value = true;
const auto v = toml::parse_str("a = null", spec);
assert(v.at("a").is_empty());
assert(v.at("a").is(toml::value_t::empty));
return 0;
}
浮動小数点数の16進数フォーマット
#
TOMLファイル内で浮動小数点数に16進数フォーマットを使用できるようになります。'><meta name=theme-color media="(prefers-color-scheme: light)" content="#ffffff"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#343a40"><meta name=color-scheme content="light dark"><meta property="og:url" content="https://toruniina.github.io/toml11/ja/docs/features/extension/"><meta property="og:site_name" content="toml11"><meta property="og:title" content="extension"><meta property="og:description" content='TOML言語拡張 # TOML言語は現在 v1.0.0 が最新版ですが、その後もいくつかの新機能が議論の末マージされ、 v1.1.0に向けて議論が続いています。
そこで議論された機能の中には、有用なケースが少ないと考えられたものや、 提案された際の方向性では導入が難しいもの、導入がされなかったものも多くあります。
toml11では、そのような機能のなかからいくつかを選んで、実験的に実装を行っています。 これらはtoml11ではサポートされていますが、他のパーサではサポートされておらず、また サポートされる予定もないことに注意してください。
また、これらの機能はデフォルトで使用されない設定になっており、 使用するためには機能フラグをそれぞれ true にしなければなりません。 非標準の機能なので、あえて明示的に書かなければ使えないように設計しています。
いくつかの機能は今後TOML言語自体に新機能としてマージされる可能性があります。 もし以下の拡張機能を完全に置き換えられる機能が導入された場合、拡張機能は 本来の機能の実装後にマイナーバージョンアップで削除される可能性があります。
null # TOMLファイル内で値としてnullを使えるようになります。
a = null b = [ 1, 2, 3, null, 5] これを使用するには、 toml::spec の ext_null_value を true にします。
パースすると、デフォルト構築した場合と同様の toml::value_t::empty となります。 ただし、ファイル内の位置情報は設定されます。
null は値の文脈でのみパースされるので、キーに null を使用した際はこれまで通り "null" という文字列のキーとして解釈されます。
#include <toml.hpp> int main() { toml::spec spec; spec.ext_null_value = true; const auto v = toml::parse_str("a = null", spec); assert(v.at("a").is_empty()); assert(v.at("a").is(toml::value_t::empty)); return 0; } 浮動小数点数の16進数フォーマット # TOMLファイル内で浮動小数点数に16進数フォーマットを使用できるようになります。'><meta property="og:locale" content="ja"><meta property="og:type" content="article"><meta property="article:section" content="docs"><title>extension | toml11</title>
<link rel=manifest href=/toml11/manifest.json><link rel=icon href=/toml11/favicon.png><link rel=canonical href=https://toruniina.github.io/toml11/ja/docs/features/extension/><link rel=alternate hreflang=en href=https://toruniina.github.io/toml11/docs/features/extension/ title=extension><link rel=stylesheet href=/toml11/book.min.ddac3efe7ea4c1007ff53e5a8fd67f12517e5d2e99984d8c67a18668f7ecaa03.css integrity="sha256-3aw+/n6kwQB/9T5aj9Z/ElF+XS6ZmE2MZ6GGaPfsqgM=" crossorigin=anonymous><script defer src=/toml11/fuse.min.js></script><script defer src=/toml11/ja.search.min.13aefbf6a803b591c02d5bc9a01dfe65fe37c31e2915c91573708d38e805d86c.js integrity="sha256-E6779qgDtZHALVvJoB3+Zf43wx4pFckVc3CNOOgF2Gw=" crossorigin=anonymous></script></head><body dir=ltr><input type=checkbox class="hidden toggle" id=menu-control>
<input type=checkbox class="hidden toggle" id=toc-control><main class="container flex"><aside class=book-menu><div class=book-menu-content><nav><h2 class=book-brand><a class="flex align-center" href=/toml11/ja/><span>toml11</span></a></h2><div class="book-search hidden"><input type=text id=book-search-input placeholder=検索 aria-label=検索 maxlength=64 data-hotkeys=s/><div class="book-search-spinner hidden"></div><ul id=book-search-results></ul></div><script>document.querySelector(".book-search").classList.remove("hidden")</script><ul class=book-languages><li><input type=checkbox id=languages class=toggle>
<label for=languages class="flex justify-between"><a role=button class="flex align-center"><img src=/toml11/svg/translate.svg class=book-icon alt=Languages>
日本語</a></label><ul><li><a href=https://toruniina.github.io/toml11/docs/features/extension/>English</a></li></ul></li></ul><ul><li><a href=/toml11/ja/docs/installation/>installation</a><ul></ul></li><li><input type=checkbox id=section-b4cfb5b55e913a8d853eacf5e8fba05f class=toggle checked>
<label for=section-b4cfb5b55e913a8d853eacf5e8fba05f class="flex justify-between"><a href=/toml11/ja/docs/features/>features</a></label><ul><li><a href=/toml11/ja/docs/features/parsing_files/>parsing files</a></li><li><a href=/toml11/ja/docs/features/value/>getting values</a></li><li><a href=/toml11/ja/docs/features/error_message/>error message</a></li><li><a href=/toml11/ja/docs/features/serialize/>serializing values</a></li><li><a href=/toml11/ja/docs/features/configure_types/>configuring types</a></li><li><a href=/toml11/ja/docs/features/literal/>toml literal</a></li><li><a href=/toml11/ja/docs/features/toml_spec/>toml spec</a></li><li><a href=/toml11/ja/docs/features/extension/ class=active>extension</a></li></ul></li><li><input type=checkbox id=section-01b096afc5186aea96713b408b47c967 class=toggle>
<label for=section-01b096afc5186aea96713b408b47c967 class="flex justify-between"><a href=/toml11/ja/docs/reference/>reference</a></label><ul><li><a href=/toml11/ja/docs/reference/color/>color.hpp</a></li><li><a href=/toml11/ja/docs/reference/comments/>comments.hpp</a></li><li><a href=/toml11/ja/docs/reference/conversion/>conversion.hpp</a></li><li><a href=/toml11/ja/docs/reference/datetime/>datetime.hpp</a></li><li><a href=/toml11/ja/docs/reference/error_info/>error_info.hpp</a></li><li><a href=/toml11/ja/docs/reference/exception/>exception.hpp</a></li><li><a href=/toml11/ja/docs/reference/find/>find.hpp</a></li><li><a href=/toml11/ja/docs/reference/format/>format.hpp</a></li><li><a href=/toml11/ja/docs/reference/from/>from.hpp</a></li><li><a href=/toml11/ja/docs/reference/get/>get.hpp</a></li><li><a href=/toml11/ja/docs/reference/into/>into.hpp</a></li><li><a href=/toml11/ja/docs/reference/literal/>literal.hpp</a></li><li><a href=/toml11/ja/docs/reference/ordered_map/>ordered_map.hpp</a></li><li><a href=/toml11/ja/docs/reference/parser/>parser.hpp</a></li><li><a href=/toml11/ja/docs/reference/result/>result.hpp</a></li><li><a href=/toml11/ja/docs/reference/serializer/>serializer.hpp</a></li><li><a href=/toml11/ja/docs/reference/source_location/>source_location.hpp</a></li><li><a href=/toml11/ja/docs/reference/spec/>spec.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml_fwd/>toml_fwd.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml/>toml.hpp</a></li><li><a href=/toml11/ja/docs/reference/types/>types.hpp</a></li><li><a href=/toml11/ja/docs/reference/value_t/>value_t.hpp</a></li><li><a href=/toml11/ja/docs/reference/value/>value.hpp</a></li><li><a href=/toml11/ja/docs/reference/version/>version.hpp</a></li><li><a href=/toml11/ja/docs/reference/visit/>visit.hpp</a></li></ul></li><li><a href=/toml11/ja/docs/changelog/>changelog</a><ul></ul></li></ul><ul><li><a href=https://github.com/ToruNiina/toml11 target=_blank rel=noopener>GitHub</a></li></ul></nav><script>(function(){var e=document.querySelector("aside .book-menu-content");addEventListener("beforeunload",function(){localStorage.setItem("menu.scrollTop",e.scrollTop)}),e.scrollTop=localStorage.getItem("menu.scrollTop")})()</script></div></aside><div class=book-page><header class=book-header><div class="flex align-center justify-between"><label for=menu-control><img src=/toml11/svg/menu.svg class=book-icon alt=Menu>
</label><strong>extension</strong>
<label for=toc-control><img src=/toml11/svg/toc.svg class=book-icon alt="Table of Contents"></label></div><aside class="hidden clearfix"><nav id=TableOfContents><ul><li><a href=#toml言語拡張>TOML言語拡張</a><ul><li><a href=#null><code>null</code></a></li><li><a href=#浮動小数点数の16進数フォーマット>浮動小数点数の16進数フォーマット</a></li><li><a href=#整数浮動小数点数のsuffix>整数・浮動小数点数のsuffix</a></li></ul></li></ul></nav></aside></header><article class="markdown book-article"><h1 id=toml言語拡張>TOML言語拡張
<a class=anchor href=#toml%e8%a8%80%e8%aa%9e%e6%8b%a1%e5%bc%b5>#</a></h1><p>TOML言語は現在 v1.0.0 が最新版ですが、その後もいくつかの新機能が議論の末マージされ、
v1.1.0に向けて議論が続いています。</p><p>そこで議論された機能の中には、有用なケースが少ないと考えられたものや、
提案された際の方向性では導入が難しいもの、導入がされなかったものも多くあります。</p><p>toml11では、そのような機能のなかからいくつかを選んで、実験的に実装を行っています。
これらはtoml11ではサポートされていますが、他のパーサではサポートされておらず、また
サポートされる予定もないことに注意してください。</p><p>また、これらの機能はデフォルトで使用されない設定になっており、
使用するためには機能フラグをそれぞれ <code>true</code> にしなければなりません。
非標準の機能なので、あえて明示的に書かなければ使えないように設計しています。</p><p>いくつかの機能は今後TOML言語自体に新機能としてマージされる可能性があります。
もし以下の拡張機能を完全に置き換えられる機能が導入された場合、拡張機能は
本来の機能の実装後にマイナーバージョンアップで削除される可能性があります。</p><h2 id=null><code>null</code>
<a class=anchor href=#null>#</a></h2><p>TOMLファイル内で値として<code>null</code>を使えるようになります。</p><pre tabindex=0><code>a = null
b = [ 1, 2, 3, null, 5]
</code></pre><p>これを使用するには、 <code>toml::spec</code><code>ext_null_value</code><code>true</code> にします。</p><p>パースすると、デフォルト構築した場合と同様の <code>toml::value_t::empty</code> となります。
ただし、ファイル内の位置情報は設定されます。</p><p><code>null</code> は値の文脈でのみパースされるので、キーに <code>null</code> を使用した際はこれまで通り
<code>"null"</code> という文字列のキーとして解釈されます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> toml<span style=color:#f92672>::</span>spec spec;
</span></span><span style=display:flex><span> spec.ext_null_value <span style=color:#f92672>=</span> true;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> v <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse_str(<span style=color:#e6db74>&#34;a = null&#34;</span>, spec);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> assert(v.at(<span style=color:#e6db74>&#34;a&#34;</span>).is_empty());
</span></span><span style=display:flex><span> assert(v.at(<span style=color:#e6db74>&#34;a&#34;</span>).is(toml<span style=color:#f92672>::</span>value_t<span style=color:#f92672>::</span>empty));
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h2 id=浮動小数点数の16進数フォーマット>浮動小数点数の16進数フォーマット
<a class=anchor href=#%e6%b5%ae%e5%8b%95%e5%b0%8f%e6%95%b0%e7%82%b9%e6%95%b0%e3%81%ae16%e9%80%b2%e6%95%b0%e3%83%95%e3%82%a9%e3%83%bc%e3%83%9e%e3%83%83%e3%83%88>#</a></h2><p>TOMLファイル内で浮動小数点数に16進数フォーマットを使用できるようになります。</p><pre tabindex=0><code>a = 0x1.91eb851eb851fp+1 # 3.14
</code></pre><p>これを使用するには、 <code>toml::spec</code><code>ext_hex_float</code><code>true</code> にします。</p><p>フォーマットは <code>printf</code><code>%a/%A</code> を指定した場合に準拠します。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> toml<span style=color:#f92672>::</span>spec spec;
</span></span><span style=display:flex><span> spec.ext_hex_float <span style=color:#f92672>=</span> true;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> v <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse_str(<span style=color:#e6db74>&#34;a = 0x1.91eb851eb851fp+1&#34;</span>, spec);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> assert(v.at(<span style=color:#e6db74>&#34;a&#34;</span>).is_floating());
</span></span><span style=display:flex><span> assert(v.at(<span style=color:#e6db74>&#34;a&#34;</span>).as_floating() <span style=color:#f92672>==</span> <span style=color:#ae81ff>3.14</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h2 id=整数浮動小数点数のsuffix>整数・浮動小数点数のsuffix
<a class=anchor href=#%e6%95%b4%e6%95%b0%e6%b5%ae%e5%8b%95%e5%b0%8f%e6%95%b0%e7%82%b9%e6%95%b0%e3%81%aesuffix>#</a></h2><p>TOMLファイル内で数値の後ろにsuffixをつけられるようになります。
10進数表記の整数と浮動小数点数で使用できます。</p><p>単位を表示するときなどに便利です。</p><pre tabindex=0><code>a = 86_400_sec
b = 3.1416_rad
c = 10_μm
</code></pre><p>ですが、これらはあくまで単なる <code>suffix</code> であり、単位換算は行われません。
単位換算が必要な場合は、ユーザーが <code>suffix</code> を参照して実装してください。</p><p>これを使用するには、 <code>toml::spec</code><code>ext_num_suffix</code><code>true</code> にします。</p><p>数値と接尾辞の間は<code>_</code>で区切られている必要があります。</p><p>数値部分との区別のため、suffixは数値で始まることはできません。</p><pre tabindex=0><code>distance = 100_m # valid
distance = 10_0m # invalid
distance = 10_0_m # valid
</code></pre><p>接尾辞は<code>std::string suffix</code>としてフォーマット情報に保持されます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> toml<span style=color:#f92672>::</span>spec spec;
</span></span><span style=display:flex><span> spec.ext_hex_float <span style=color:#f92672>=</span> true;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> v <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse_str(<span style=color:#e6db74>&#34;a = 86_400_sec&#34;</span>, spec);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> assert(v.at(<span style=color:#e6db74>&#34;a&#34;</span>).is_integer());
</span></span><span style=display:flex><span> assert(v.at(<span style=color:#e6db74>&#34;a&#34;</span>).as_integer() <span style=color:#f92672>==</span> <span style=color:#ae81ff>86400</span>);
</span></span><span style=display:flex><span> assert(v.at(<span style=color:#e6db74>&#34;a&#34;</span>).as_integer_fmt().suffix <span style=color:#f92672>==</span> <span style=color:#e6db74>&#34;sec&#34;</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div></article><footer class=book-footer><div class="flex flex-wrap justify-between"></div><script>(function(){function e(e){const t=window.getSelection(),n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}document.querySelectorAll("pre code").forEach(t=>{t.addEventListener("click",function(){if(window.getSelection().toString())return;e(t.parentElement),navigator.clipboard&&navigator.clipboard.writeText(t.parentElement.textContent)})})})()</script></footer><label for=menu-control class="hidden book-menu-overlay"></label></div><aside class=book-toc><div class=book-toc-content><nav id=TableOfContents><ul><li><a href=#toml言語拡張>TOML言語拡張</a><ul><li><a href=#null><code>null</code></a></li><li><a href=#浮動小数点数の16進数フォーマット>浮動小数点数の16進数フォーマット</a></li><li><a href=#整数浮動小数点数のsuffix>整数・浮動小数点数のsuffix</a></li></ul></li></ul></nav></div></aside></main></body></html>

137
ja/docs/features/index.html Normal file
View File

@@ -0,0 +1,137 @@
<!doctype html><html lang=ja dir=ltr><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="
features
#
ここでは、toml11が提供する主な機能について、例を挙げながら説明します。
ファイル・文字列をパースする
#
ファイルや文字列をパースする関数と、それが出力するエラーの扱い方について説明します。
以下の内容を含みます。
ファイルをパースする
文字列をパースする
バイト列をパースする
例外を投げずにファイルをパースする
例外を投げずに文字列をパースする
例外を投げずにバイト列をパースする
toml::valueから値を取り出す
#
toml::valueが持つデータの型を調べ、取り出す方法、型変換を行う方法について説明します。
以下の内容を含みます。
メンバ関数を使って値の型を調べる
メンバ関数を使って値にアクセスする
コメントにアクセスする
インラインテーブル・ドットキーの取り扱い
日付情報の取り扱い
toml::get<T>を使って変換する
toml::get_orを使って失敗時の値を指定する
toml::find<T>を使って検索と変換を行う
toml::find_orを使って失敗時の値を指定する
ユーザー定義型との変換を定義する
toml::visitで関数を適用する
toml::valueを構築する
エラーメッセージを作る
#
toml::valueの値を使って、TOMLファイル中の位置情報つきのエラーメッセージを生成する方法について説明します。
以下の内容を含みます。
toml::value の位置情報を取り出す
エラーメッセージを構築する
出力に色を付ける
TOMLファイルを出力する
#
toml::valueの値をフォーマットする方法と、可能なフォーマット指定について説明します。
以下の内容を含みます。
toml::valueの値ごとにフォーマットを指定する
toml::valueをフォーマットして文字列化する
toml::valueの型を変更する
#
toml::valueが格納する型integer_typeやtable_typeをカスタマイズする方法について説明します。
以下の内容を含みます。
type_configの定義
ordered_type_configを使用する
コメントを保存しないようにする
std::dequeなどの異なるコンテナを使用する
boost::multiprecisionなどの異なる数値型を使用する
TOMLリテラル
#
C++内にTOMLファイルを埋め込むための_tomlリテラルについて説明します。
以下の内容を含みます。
TOMLリテラルを使用する
TOML言語バージョン
#
toml11がサポートするTOML言語のバージョン、主にTOML-v1.1.0で追加された言語機能を制御する方法について説明します。
以下の内容を含みます。
TOML言語の1.1.0を使用する
TOML言語の1.1.0の一部の機能のみ使用する
TOML言語拡張
#
toml11独自のTOML言語拡張について説明します。
以下の内容を含みます。
null をサポートする
浮動小数点数の16進数フォーマットをサポートする
数値に単位を付けられるようにする
"><meta name=theme-color media="(prefers-color-scheme: light)" content="#ffffff"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#343a40"><meta name=color-scheme content="light dark"><meta property="og:url" content="https://toruniina.github.io/toml11/ja/docs/features/"><meta property="og:site_name" content="toml11"><meta property="og:title" content="features"><meta property="og:description" content="features # ここでは、toml11が提供する主な機能について、例を挙げながら説明します。
ファイル・文字列をパースする # ファイルや文字列をパースする関数と、それが出力するエラーの扱い方について説明します。
以下の内容を含みます。
ファイルをパースする 文字列をパースする バイト列をパースする 例外を投げずにファイルをパースする 例外を投げずに文字列をパースする 例外を投げずにバイト列をパースする toml::valueから値を取り出す # toml::valueが持つデータの型を調べ、取り出す方法、型変換を行う方法について説明します。
以下の内容を含みます。
メンバ関数を使って値の型を調べる メンバ関数を使って値にアクセスする コメントにアクセスする インラインテーブル・ドットキーの取り扱い 日付情報の取り扱い toml::get<T>を使って変換する toml::get_orを使って失敗時の値を指定する toml::find<T>を使って検索と変換を行う toml::find_orを使って失敗時の値を指定する ユーザー定義型との変換を定義する toml::visitで関数を適用する toml::valueを構築する エラーメッセージを作る # toml::valueの値を使って、TOMLファイル中の位置情報つきのエラーメッセージを生成する方法について説明します。
以下の内容を含みます。
toml::value の位置情報を取り出す エラーメッセージを構築する 出力に色を付ける TOMLファイルを出力する # toml::valueの値をフォーマットする方法と、可能なフォーマット指定について説明します。
以下の内容を含みます。
toml::valueの値ごとにフォーマットを指定する toml::valueをフォーマットして文字列化する toml::valueの型を変更する # toml::valueが格納する型integer_typeやtable_typeをカスタマイズする方法について説明します。
以下の内容を含みます。
type_configの定義 ordered_type_configを使用する コメントを保存しないようにする std::dequeなどの異なるコンテナを使用する boost::multiprecisionなどの異なる数値型を使用する TOMLリテラル # C++内にTOMLファイルを埋め込むための_tomlリテラルについて説明します。
以下の内容を含みます。
TOMLリテラルを使用する TOML言語バージョン # toml11がサポートするTOML言語のバージョン、主にTOML-v1.1.0で追加された言語機能を制御する方法について説明します。
以下の内容を含みます。
TOML言語の1.1.0を使用する TOML言語の1.1.0の一部の機能のみ使用する TOML言語拡張 # toml11独自のTOML言語拡張について説明します。
以下の内容を含みます。
null をサポートする 浮動小数点数の16進数フォーマットをサポートする 数値に単位を付けられるようにする"><meta property="og:locale" content="ja"><meta property="og:type" content="website"><title>features | toml11</title>
<link rel=manifest href=/toml11/manifest.json><link rel=icon href=/toml11/favicon.png><link rel=canonical href=https://toruniina.github.io/toml11/ja/docs/features/><link rel=alternate hreflang=en href=https://toruniina.github.io/toml11/docs/features/ title=features><link rel=stylesheet href=/toml11/book.min.ddac3efe7ea4c1007ff53e5a8fd67f12517e5d2e99984d8c67a18668f7ecaa03.css integrity="sha256-3aw+/n6kwQB/9T5aj9Z/ElF+XS6ZmE2MZ6GGaPfsqgM=" crossorigin=anonymous><script defer src=/toml11/fuse.min.js></script><script defer src=/toml11/ja.search.min.13aefbf6a803b591c02d5bc9a01dfe65fe37c31e2915c91573708d38e805d86c.js integrity="sha256-E6779qgDtZHALVvJoB3+Zf43wx4pFckVc3CNOOgF2Gw=" crossorigin=anonymous></script><link rel=alternate type=application/rss+xml href=https://toruniina.github.io/toml11/ja/docs/features/index.xml title=toml11></head><body dir=ltr><input type=checkbox class="hidden toggle" id=menu-control>
<input type=checkbox class="hidden toggle" id=toc-control><main class="container flex"><aside class=book-menu><div class=book-menu-content><nav><h2 class=book-brand><a class="flex align-center" href=/toml11/ja/><span>toml11</span></a></h2><div class="book-search hidden"><input type=text id=book-search-input placeholder=検索 aria-label=検索 maxlength=64 data-hotkeys=s/><div class="book-search-spinner hidden"></div><ul id=book-search-results></ul></div><script>document.querySelector(".book-search").classList.remove("hidden")</script><ul class=book-languages><li><input type=checkbox id=languages class=toggle>
<label for=languages class="flex justify-between"><a role=button class="flex align-center"><img src=/toml11/svg/translate.svg class=book-icon alt=Languages>
日本語</a></label><ul><li><a href=https://toruniina.github.io/toml11/docs/features/>English</a></li></ul></li></ul><ul><li><a href=/toml11/ja/docs/installation/>installation</a><ul></ul></li><li><input type=checkbox id=section-b4cfb5b55e913a8d853eacf5e8fba05f class=toggle checked>
<label for=section-b4cfb5b55e913a8d853eacf5e8fba05f class="flex justify-between"><a href=/toml11/ja/docs/features/ class=active>features</a></label><ul><li><a href=/toml11/ja/docs/features/parsing_files/>parsing files</a></li><li><a href=/toml11/ja/docs/features/value/>getting values</a></li><li><a href=/toml11/ja/docs/features/error_message/>error message</a></li><li><a href=/toml11/ja/docs/features/serialize/>serializing values</a></li><li><a href=/toml11/ja/docs/features/configure_types/>configuring types</a></li><li><a href=/toml11/ja/docs/features/literal/>toml literal</a></li><li><a href=/toml11/ja/docs/features/toml_spec/>toml spec</a></li><li><a href=/toml11/ja/docs/features/extension/>extension</a></li></ul></li><li><input type=checkbox id=section-01b096afc5186aea96713b408b47c967 class=toggle>
<label for=section-01b096afc5186aea96713b408b47c967 class="flex justify-between"><a href=/toml11/ja/docs/reference/>reference</a></label><ul><li><a href=/toml11/ja/docs/reference/color/>color.hpp</a></li><li><a href=/toml11/ja/docs/reference/comments/>comments.hpp</a></li><li><a href=/toml11/ja/docs/reference/conversion/>conversion.hpp</a></li><li><a href=/toml11/ja/docs/reference/datetime/>datetime.hpp</a></li><li><a href=/toml11/ja/docs/reference/error_info/>error_info.hpp</a></li><li><a href=/toml11/ja/docs/reference/exception/>exception.hpp</a></li><li><a href=/toml11/ja/docs/reference/find/>find.hpp</a></li><li><a href=/toml11/ja/docs/reference/format/>format.hpp</a></li><li><a href=/toml11/ja/docs/reference/from/>from.hpp</a></li><li><a href=/toml11/ja/docs/reference/get/>get.hpp</a></li><li><a href=/toml11/ja/docs/reference/into/>into.hpp</a></li><li><a href=/toml11/ja/docs/reference/literal/>literal.hpp</a></li><li><a href=/toml11/ja/docs/reference/ordered_map/>ordered_map.hpp</a></li><li><a href=/toml11/ja/docs/reference/parser/>parser.hpp</a></li><li><a href=/toml11/ja/docs/reference/result/>result.hpp</a></li><li><a href=/toml11/ja/docs/reference/serializer/>serializer.hpp</a></li><li><a href=/toml11/ja/docs/reference/source_location/>source_location.hpp</a></li><li><a href=/toml11/ja/docs/reference/spec/>spec.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml_fwd/>toml_fwd.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml/>toml.hpp</a></li><li><a href=/toml11/ja/docs/reference/types/>types.hpp</a></li><li><a href=/toml11/ja/docs/reference/value_t/>value_t.hpp</a></li><li><a href=/toml11/ja/docs/reference/value/>value.hpp</a></li><li><a href=/toml11/ja/docs/reference/version/>version.hpp</a></li><li><a href=/toml11/ja/docs/reference/visit/>visit.hpp</a></li></ul></li><li><a href=/toml11/ja/docs/changelog/>changelog</a><ul></ul></li></ul><ul><li><a href=https://github.com/ToruNiina/toml11 target=_blank rel=noopener>GitHub</a></li></ul></nav><script>(function(){var e=document.querySelector("aside .book-menu-content");addEventListener("beforeunload",function(){localStorage.setItem("menu.scrollTop",e.scrollTop)}),e.scrollTop=localStorage.getItem("menu.scrollTop")})()</script></div></aside><div class=book-page><header class=book-header><div class="flex align-center justify-between"><label for=menu-control><img src=/toml11/svg/menu.svg class=book-icon alt=Menu>
</label><strong>features</strong>
<label for=toc-control><img src=/toml11/svg/toc.svg class=book-icon alt="Table of Contents"></label></div><aside class="hidden clearfix"><nav id=TableOfContents><ul><li><a href=#features>features</a><ul><li><a href=#ファイル文字列をパースする><a href=parsing_files>ファイル・文字列をパースする</a></a></li><li><a href=#tomlvalue><a href=value><code>toml::value</code>から値を取り出す</a></a></li><li><a href=#エラーメッセージを作る><a href=error_message>エラーメッセージを作る</a></a></li><li><a href=#tomlファイルを出力する><a href=serialize>TOMLファイルを出力する</a></a></li><li><a href=#tomlvalue-1><a href=configure_types><code>toml::value</code>の型を変更する</a></a></li><li><a href=#tomlリテラル><a href=literal>TOMLリテラル</a></a></li><li><a href=#toml言語バージョン><a href=toml_spec>TOML言語バージョン</a></a></li><li><a href=#toml言語拡張><a href=extension>TOML言語拡張</a></a></li></ul></li></ul></nav></aside></header><article class="markdown book-article"><h1 id=features>features
<a class=anchor href=#features>#</a></h1><p>ここでは、toml11が提供する主な機能について、例を挙げながら説明します。</p><h2 id=ファイル文字列をパースする><a href=parsing_files>ファイル・文字列をパースする</a>
<a class=anchor href=#%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e3%83%91%e3%83%bc%e3%82%b9%e3%81%99%e3%82%8b>#</a></h2><p>ファイルや文字列をパースする関数と、それが出力するエラーの扱い方について説明します。</p><p>以下の内容を含みます。</p><ul><li>ファイルをパースする</li><li>文字列をパースする</li><li>バイト列をパースする</li><li>例外を投げずにファイルをパースする</li><li>例外を投げずに文字列をパースする</li><li>例外を投げずにバイト列をパースする</li></ul><h2 id=tomlvalue><a href=value><code>toml::value</code>から値を取り出す</a>
<a class=anchor href=#tomlvalue>#</a></h2><p><code>toml::value</code>が持つデータの型を調べ、取り出す方法、型変換を行う方法について説明します。</p><p>以下の内容を含みます。</p><ul><li>メンバ関数を使って値の型を調べる</li><li>メンバ関数を使って値にアクセスする</li><li>コメントにアクセスする</li><li>インラインテーブル・ドットキーの取り扱い</li><li>日付情報の取り扱い</li><li><code>toml::get&lt;T></code>を使って変換する</li><li><code>toml::get_or</code>を使って失敗時の値を指定する</li><li><code>toml::find&lt;T></code>を使って検索と変換を行う</li><li><code>toml::find_or</code>を使って失敗時の値を指定する</li><li>ユーザー定義型との変換を定義する</li><li><code>toml::visit</code>で関数を適用する</li><li><code>toml::value</code>を構築する</li></ul><h2 id=エラーメッセージを作る><a href=error_message>エラーメッセージを作る</a>
<a class=anchor href=#%e3%82%a8%e3%83%a9%e3%83%bc%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e3%82%92%e4%bd%9c%e3%82%8b>#</a></h2><p><code>toml::value</code>の値を使って、TOMLファイル中の位置情報つきのエラーメッセージを生成する方法について説明します。</p><p>以下の内容を含みます。</p><ul><li><code>toml::value</code> の位置情報を取り出す</li><li>エラーメッセージを構築する</li><li>出力に色を付ける</li></ul><h2 id=tomlファイルを出力する><a href=serialize>TOMLファイルを出力する</a>
<a class=anchor href=#toml%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e5%87%ba%e5%8a%9b%e3%81%99%e3%82%8b>#</a></h2><p><code>toml::value</code>の値をフォーマットする方法と、可能なフォーマット指定について説明します。</p><p>以下の内容を含みます。</p><ul><li><code>toml::value</code>の値ごとにフォーマットを指定する</li><li><code>toml::value</code>をフォーマットして文字列化する</li></ul><h2 id=tomlvalue-1><a href=configure_types><code>toml::value</code>の型を変更する</a>
<a class=anchor href=#tomlvalue-1>#</a></h2><p><code>toml::value</code>が格納する型(<code>integer_type</code><code>table_type</code>をカスタマイズする方法について説明します。</p><p>以下の内容を含みます。</p><ul><li><code>type_config</code>の定義</li><li><code>ordered_type_config</code>を使用する</li><li>コメントを保存しないようにする</li><li><code>std::deque</code>などの異なるコンテナを使用する</li><li><code>boost::multiprecision</code>などの異なる数値型を使用する</li></ul><h2 id=tomlリテラル><a href=literal>TOMLリテラル</a>
<a class=anchor href=#toml%e3%83%aa%e3%83%86%e3%83%a9%e3%83%ab>#</a></h2><p>C++内にTOMLファイルを埋め込むための<code>_toml</code>リテラルについて説明します。</p><p>以下の内容を含みます。</p><ul><li>TOMLリテラルを使用する</li></ul><h2 id=toml言語バージョン><a href=toml_spec>TOML言語バージョン</a>
<a class=anchor href=#toml%e8%a8%80%e8%aa%9e%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3>#</a></h2><p>toml11がサポートするTOML言語のバージョン、主にTOML-v1.1.0で追加された言語機能を制御する方法について説明します。</p><p>以下の内容を含みます。</p><ul><li>TOML言語の1.1.0を使用する</li><li>TOML言語の1.1.0の一部の機能のみ使用する</li></ul><h2 id=toml言語拡張><a href=extension>TOML言語拡張</a>
<a class=anchor href=#toml%e8%a8%80%e8%aa%9e%e6%8b%a1%e5%bc%b5>#</a></h2><p>toml11独自のTOML言語拡張について説明します。</p><p>以下の内容を含みます。</p><ul><li><code>null</code> をサポートする</li><li>浮動小数点数の16進数フォーマットをサポートする</li><li>数値に単位を付けられるようにする</li></ul></article><footer class=book-footer><div class="flex flex-wrap justify-between"></div><script>(function(){function e(e){const t=window.getSelection(),n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}document.querySelectorAll("pre code").forEach(t=>{t.addEventListener("click",function(){if(window.getSelection().toString())return;e(t.parentElement),navigator.clipboard&&navigator.clipboard.writeText(t.parentElement.textContent)})})})()</script></footer><label for=menu-control class="hidden book-menu-overlay"></label></div><aside class=book-toc><div class=book-toc-content><nav id=TableOfContents><ul><li><a href=#features>features</a><ul><li><a href=#ファイル文字列をパースする><a href=parsing_files>ファイル・文字列をパースする</a></a></li><li><a href=#tomlvalue><a href=value><code>toml::value</code>から値を取り出す</a></a></li><li><a href=#エラーメッセージを作る><a href=error_message>エラーメッセージを作る</a></a></li><li><a href=#tomlファイルを出力する><a href=serialize>TOMLファイルを出力する</a></a></li><li><a href=#tomlvalue-1><a href=configure_types><code>toml::value</code>の型を変更する</a></a></li><li><a href=#tomlリテラル><a href=literal>TOMLリテラル</a></a></li><li><a href=#toml言語バージョン><a href=toml_spec>TOML言語バージョン</a></a></li><li><a href=#toml言語拡張><a href=extension>TOML言語拡張</a></a></li></ul></li></ul></nav></div></aside></main></body></html>

341
ja/docs/features/index.xml Normal file
View File

@@ -0,0 +1,341 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>features on toml11</title><link>https://toruniina.github.io/toml11/ja/docs/features/</link><description>Recent content in features on toml11</description><generator>Hugo</generator><language>ja</language><atom:link href="https://toruniina.github.io/toml11/ja/docs/features/index.xml" rel="self" type="application/rss+xml"/><item><title>parsing files</title><link>https://toruniina.github.io/toml11/ja/docs/features/parsing_files/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://toruniina.github.io/toml11/ja/docs/features/parsing_files/</guid><description>&lt;h1 id="ファイル文字列をパースする">
ファイル・文字列をパースする
&lt;a class="anchor" href="#%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e3%83%91%e3%83%bc%e3%82%b9%e3%81%99%e3%82%8b">#&lt;/a>
&lt;/h1>
&lt;p>toml11では、&lt;code>toml::parse&lt;/code> や &lt;code>toml::try_parse&lt;/code> を使って、ファイルや文字列、バイト列をパースすることができます。&lt;/p>
&lt;p>これらは成功時に &lt;code>toml::value&lt;/code> を返します。
ファイルは常にテーブルになりますが、返り値が &lt;code>toml::table&lt;/code> でないことに気を付けてください。
&lt;code>toml::value&lt;/code> はファイルに関するメタデータを持っており、
&lt;code>toml::table&lt;/code> は &lt;code>std::unordered_map&amp;lt;std::stirng, toml::value&amp;gt;&lt;/code> のエイリアスでしかありません。
メタデータを返すために、 &lt;code>toml::table&lt;/code> ではなく &lt;code>toml::value&lt;/code> を返しています。
ファイルのルートに対応する &lt;code>toml::value&lt;/code> は常に &lt;code>table_type&lt;/code> を持ちます。&lt;/p>
&lt;h2 id="ファイルをパースする">
ファイルをパースする
&lt;a class="anchor" href="#%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e3%83%91%e3%83%bc%e3%82%b9%e3%81%99%e3%82%8b">#&lt;/a>
&lt;/h2>
&lt;p>ファイルをパースする際は、
&lt;a href="https://toruniina.github.io/toml11/ja/docs/reference/parser/#parse">&lt;code>toml::parse&lt;/code>&lt;/a>
または
&lt;a href="https://toruniina.github.io/toml11/ja/docs/reference/parser/#try_parse">&lt;code>toml::try_parse&lt;/code>&lt;/a>
を使います。&lt;/p>
&lt;h3 id="tomlparse">
&lt;code>toml::parse&lt;/code>
&lt;a class="anchor" href="#tomlparse">#&lt;/a>
&lt;/h3>
&lt;h4 id="stdstringでファイル名を指定する">
&lt;code>std::string&lt;/code>でファイル名を指定する
&lt;a class="anchor" href="#stdstring%e3%81%a7%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e5%90%8d%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b">#&lt;/a>
&lt;/h4>
&lt;p>&lt;a href="https://toruniina.github.io/toml11/ja/docs/reference/parser/#parse">&lt;code>toml::parse&lt;/code>&lt;/a>
は、文字列でファイル名を受け取り、そのファイルを開いてパースします。&lt;/p>
&lt;p>以下のサンプルは、&lt;code>input.toml&lt;/code>というファイルをパースし、&lt;code>title&lt;/code>という変数を文字列として取り出し、出力するコードです。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;toml.hpp&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> toml&lt;span style="color:#f92672">::&lt;/span>value input &lt;span style="color:#f92672">=&lt;/span> toml&lt;span style="color:#f92672">::&lt;/span>parse(&lt;span style="color:#e6db74">&amp;#34;input.toml&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> std&lt;span style="color:#f92672">::&lt;/span>cout &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> input.at(&lt;span style="color:#e6db74">&amp;#34;title&amp;#34;&lt;/span>).as_string() &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>endl;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="stdfilesystempathでファイルを指定する">
&lt;code>std::filesystem::path&lt;/code>でファイルを指定する
&lt;a class="anchor" href="#stdfilesystempath%e3%81%a7%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b">#&lt;/a>
&lt;/h4>
&lt;p>&lt;a href="https://toruniina.github.io/toml11/ja/docs/reference/parser/#parse">&lt;code>toml::parse&lt;/code>&lt;/a>
には、&lt;code>std::filesystem::path&lt;/code>を渡すことも可能です。&lt;/p>
&lt;p>当然ですが、&lt;code>&amp;lt;filesystem&amp;gt;&lt;/code>がサポートされるC++17以降でなければ使用できません。&lt;/p>
&lt;h4 id="stdistreamで入力ストリームを指定する">
&lt;code>std::istream&lt;/code>で入力ストリームを指定する
&lt;a class="anchor" href="#stdistream%e3%81%a7%e5%85%a5%e5%8a%9b%e3%82%b9%e3%83%88%e3%83%aa%e3%83%bc%e3%83%a0%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b">#&lt;/a>
&lt;/h4>
&lt;p>&lt;a href="https://toruniina.github.io/toml11/ja/docs/reference/parser/#parse">&lt;code>toml::parse&lt;/code>&lt;/a>
には、&lt;code>std::istream&lt;/code>を渡すことも可能です。&lt;/p></description></item><item><title>getting values</title><link>https://toruniina.github.io/toml11/ja/docs/features/value/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://toruniina.github.io/toml11/ja/docs/features/value/</guid><description>&lt;h1 id="値を取り出す">
値を取り出す
&lt;a class="anchor" href="#%e5%80%a4%e3%82%92%e5%8f%96%e3%82%8a%e5%87%ba%e3%81%99">#&lt;/a>
&lt;/h1>
&lt;p>ここでは、 &lt;code>toml::value&lt;/code> が格納している値にアクセスする方法を説明します。&lt;/p>
&lt;h2 id="メンバ関数を使って値にアクセスする">
メンバ関数を使って値にアクセスする
&lt;a class="anchor" href="#%e3%83%a1%e3%83%b3%e3%83%90%e9%96%a2%e6%95%b0%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e5%80%a4%e3%81%ab%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%81%99%e3%82%8b">#&lt;/a>
&lt;/h2>
&lt;h3 id="is_something-と-as_something">
&lt;code>is_something&lt;/code> と &lt;code>as_something&lt;/code>
&lt;a class="anchor" href="#is_something-%e3%81%a8-as_something">#&lt;/a>
&lt;/h3>
&lt;p>&lt;code>toml::value&lt;/code> は &lt;code>is_boolean()&lt;/code> や &lt;code>is_integer()&lt;/code> などのメンバ関数を持っており、
これらを使うと持っている型を調べることができます。&lt;/p>
&lt;p>また、 &lt;code>as_boolean()&lt;/code>, &lt;code>as_integer()&lt;/code> などのメンバ関数も持っており、
これらを使ってその型にアクセスすることができます。&lt;/p>
&lt;p>完全なリストは &lt;a href="https://toruniina.github.io/toml11/ja/docs/reference/value/#is_xxx">&lt;code>toml::value&lt;/code> のリファレンス&lt;/a> を参照してください。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>toml&lt;span style="color:#f92672">::&lt;/span>value v &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#75715e">/* ... */&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span>(v.is_integer())
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> std&lt;span style="color:#f92672">::&lt;/span>cout &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> v.as_integer() &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>endl;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>指定された値と異なる型が格納されていた場合、 &lt;a href="https://toruniina.github.io/toml11/ja/docs/reference/value/#tomltype_error">&lt;code>toml::type_error&lt;/code>&lt;/a> が送出されます。&lt;/p>
&lt;p>その &lt;code>what()&lt;/code> は以下のようなメッセージを含みます。&lt;/p>
&lt;pre tabindex="0">&lt;code>[error] toml::value::as_string(): bad_cast to string
--&amp;gt; input.toml
|
1 | a = 123_456
| ^^^^^^^-- the actual type is integer
&lt;/code>&lt;/pre>&lt;h3 id="tomlvalue_t">
&lt;code>toml::value_t&lt;/code>
&lt;a class="anchor" href="#tomlvalue_t">#&lt;/a>
&lt;/h3>
&lt;p>型情報は &lt;a href="https://toruniina.github.io/toml11/ja/docs/reference/value_t/">&lt;code>enum class toml::value_t&lt;/code>&lt;/a> で識別できます。&lt;/p></description></item><item><title>error message</title><link>https://toruniina.github.io/toml11/ja/docs/features/error_message/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://toruniina.github.io/toml11/ja/docs/features/error_message/</guid><description>&lt;h1 id="エラーメッセージを出力する">
エラーメッセージを出力する
&lt;a class="anchor" href="#%e3%82%a8%e3%83%a9%e3%83%bc%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e3%82%92%e5%87%ba%e5%8a%9b%e3%81%99%e3%82%8b">#&lt;/a>
&lt;/h1>
&lt;p>toml11は &lt;code>toml::parse&lt;/code> や &lt;code>toml::get&amp;lt;T&amp;gt;/find&amp;lt;T&amp;gt;&lt;/code>, &lt;code>as_integer()&lt;/code> などから
ファイル内の位置情報を含んだエラーメッセージを出力します。&lt;/p>
&lt;p>例えば、パース時に整数の文法エラーを発見した場合、&lt;/p>
&lt;pre tabindex="0">&lt;code>[error] bad integer: `_` must be surrounded by digits
--&amp;gt; internal string at line 64 in file main.cpp
|
1 | a = 123__456
| ^-- invalid underscore
Hint: valid : -42, 1_000, 1_2_3_4_5, 0xC0FFEE, 0b0010, 0o755
Hint: invalid: _42, 1__000, 0123
&lt;/code>&lt;/pre>&lt;p>あるいは実際に格納されている型と異なる型を要求した場合&lt;/p>
&lt;pre tabindex="0">&lt;code>[error] toml::value::as_string(): bad_cast to string
--&amp;gt; input.toml
|
1 | a = 123_456
| ^^^^^^^-- the actual type is integer
&lt;/code>&lt;/pre>&lt;p>toml11は &lt;code>toml::value&lt;/code> からこのようなエラーメッセージを作成する方法を提供します。&lt;/p></description></item><item><title>serializing values</title><link>https://toruniina.github.io/toml11/ja/docs/features/serialize/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://toruniina.github.io/toml11/ja/docs/features/serialize/</guid><description>&lt;h1 id="tomlファイルを出力する">
TOMLファイルを出力する
&lt;a class="anchor" href="#toml%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e5%87%ba%e5%8a%9b%e3%81%99%e3%82%8b">#&lt;/a>
&lt;/h1>
&lt;p>&lt;code>toml::format&lt;/code> を使うと、 &lt;code>toml::value&lt;/code> を文字列にすることができます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;toml.hpp&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;cassert&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> toml&lt;span style="color:#f92672">::&lt;/span>value v(toml&lt;span style="color:#f92672">::&lt;/span>table{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>, &lt;span style="color:#ae81ff">42&lt;/span>},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&lt;span style="color:#e6db74">&amp;#34;b&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;foo&amp;#34;&lt;/span>},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>string s &lt;span style="color:#f92672">=&lt;/span> toml&lt;span style="color:#f92672">::&lt;/span>format(v);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> toml&lt;span style="color:#f92672">::&lt;/span>value u &lt;span style="color:#f92672">=&lt;/span> toml&lt;span style="color:#f92672">::&lt;/span>parse_str(s);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> assert(u.at(&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>).as_integer() &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">42&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> assert(u.at(&lt;span style="color:#e6db74">&amp;#34;b&amp;#34;&lt;/span>).as_string() &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;foo&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>table_type&lt;/code> を格納している &lt;code>toml::value&lt;/code> が渡されると、それがファイルのルートテーブルとして解釈されます。&lt;/p>
&lt;p>もし &lt;code>table_type&lt;/code> 以外を格納している &lt;code>toml::value&lt;/code> が渡されると、その値だけがフォーマットされます。&lt;/p>
&lt;p>一部のフォーマット指定では、キーが渡されていないとフォーマットできないことがあります。
例えば、 &lt;code>toml::array_format::array_of_tables&lt;/code> は &lt;code>[[array.of.tables]]&lt;/code> の形でフォーマットするので、
キーへのアクセスを要求します。&lt;/p>
&lt;p>キーを要求するフォーマット指定の値がキーなしで渡された場合、 &lt;code>toml::serialization_error&lt;/code> が送出されます。&lt;/p>
&lt;p>他にも、フォーマット指定と矛盾する値が含まれる場合には、 &lt;code>toml::serialization_error&lt;/code> が送出されます。
例えば、 &lt;code>integer_format::hex&lt;/code> が指定された整数が負の値を持っている場合や、
&lt;code>string_format::literal&lt;/code> が指定された文字列が改行を含んでいる場合などです。&lt;/p>
&lt;p>フォーマットの指定方法は後述します。&lt;/p>
&lt;h2 id="キーを渡して出力する">
キーを渡して出力する
&lt;a class="anchor" href="#%e3%82%ad%e3%83%bc%e3%82%92%e6%b8%a1%e3%81%97%e3%81%a6%e5%87%ba%e5%8a%9b%e3%81%99%e3%82%8b">#&lt;/a>
&lt;/h2>
&lt;p>&lt;code>toml::format&lt;/code> には &lt;code>std::string&lt;/code> としてキーを渡すことが可能です。&lt;/p></description></item><item><title>configuring types</title><link>https://toruniina.github.io/toml11/ja/docs/features/configure_types/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://toruniina.github.io/toml11/ja/docs/features/configure_types/</guid><description>&lt;h1 id="型をカスタマイズする">
型をカスタマイズする
&lt;a class="anchor" href="#%e5%9e%8b%e3%82%92%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba%e3%81%99%e3%82%8b">#&lt;/a>
&lt;/h1>
&lt;p>&lt;code>toml::value&lt;/code> は &lt;code>integer_type&lt;/code> として &lt;code>std::int64_t&lt;/code> を、
&lt;code>table_type&lt;/code> として &lt;code>std::unordered_map&amp;lt;key_type, value_type&amp;gt;&lt;/code> を使用します。&lt;/p>
&lt;p>しかし、場合によっては &lt;code>boost::multiprecision::int128_t&lt;/code> や、 &lt;code>std::map&lt;/code> を使用したい場合もあります。&lt;/p>
&lt;p>そのため、 &lt;code>toml::value&lt;/code> は &lt;code>template&lt;/code> 引数を取って格納する型を変えられるように実装されています。&lt;/p>
&lt;p>&lt;code>std::string&lt;/code> が実際には &lt;code>std::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt;&amp;gt;&lt;/code> の
エイリアスであるように、 &lt;code>toml::value&lt;/code> は実際には &lt;code>toml::basic_value&amp;lt;toml::type_config&amp;gt;&lt;/code> のエイリアスです。&lt;/p>
&lt;p>ここでは、 &lt;code>toml::type_config&lt;/code> が持つ型と、異なる &lt;code>config&lt;/code> 型を定義する方法を説明します。&lt;/p>
&lt;h2 id="type_config">
&lt;code>type_config&lt;/code>
&lt;a class="anchor" href="#type_config">#&lt;/a>
&lt;/h2>
&lt;p>&lt;code>type_config&lt;/code> は、以下のメンバ型と&lt;code>static&lt;/code>メンバ関数を持つクラスです。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">namespace&lt;/span> toml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">struct&lt;/span> &lt;span style="color:#a6e22e">type_config&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">using&lt;/span> comment_type &lt;span style="color:#f92672">=&lt;/span> preserve_comments;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">using&lt;/span> boolean_type &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">bool&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">using&lt;/span> integer_type &lt;span style="color:#f92672">=&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>&lt;span style="color:#66d9ef">int64_t&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">using&lt;/span> floating_type &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">double&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">using&lt;/span> string_type &lt;span style="color:#f92672">=&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>string;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">template&lt;/span>&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#66d9ef">typename&lt;/span> T&lt;span style="color:#f92672">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">using&lt;/span> array_type &lt;span style="color:#f92672">=&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>vector&lt;span style="color:#f92672">&amp;lt;&lt;/span>T&lt;span style="color:#f92672">&amp;gt;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">template&lt;/span>&lt;span style="color:#f92672">&amp;lt;&lt;/span>&lt;span style="color:#66d9ef">typename&lt;/span> K, &lt;span style="color:#66d9ef">typename&lt;/span> T&lt;span style="color:#f92672">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">using&lt;/span> table_type &lt;span style="color:#f92672">=&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>unordered_map&lt;span style="color:#f92672">&amp;lt;&lt;/span>K, T&lt;span style="color:#f92672">&amp;gt;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">static&lt;/span> result&lt;span style="color:#f92672">&amp;lt;&lt;/span>integer_type, error_info&lt;span style="color:#f92672">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> parse_int(&lt;span style="color:#66d9ef">const&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>string&lt;span style="color:#f92672">&amp;amp;&lt;/span> str, &lt;span style="color:#66d9ef">const&lt;/span> source_location src, &lt;span style="color:#66d9ef">const&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>&lt;span style="color:#66d9ef">uint8_t&lt;/span> base);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">static&lt;/span> result&lt;span style="color:#f92672">&amp;lt;&lt;/span>floating_type, error_info&lt;span style="color:#f92672">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> parse_float(&lt;span style="color:#66d9ef">const&lt;/span> std&lt;span style="color:#f92672">::&lt;/span>string&lt;span style="color:#f92672">&amp;amp;&lt;/span> str, &lt;span style="color:#66d9ef">const&lt;/span> source_location src, &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">bool&lt;/span> is_hex);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>toml::basic_value&amp;lt;TypeConfig&amp;gt;&lt;/code> は、格納する &lt;code>boolean_type&lt;/code> を &lt;code>TypeConfig::boolean_type&lt;/code>、
格納する &lt;code>integer_type&lt;/code> を &lt;code>TypeConfig::integer_type&lt;/code> 、のようにして定義しています。&lt;/p></description></item><item><title>toml literal</title><link>https://toruniina.github.io/toml11/ja/docs/features/literal/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://toruniina.github.io/toml11/ja/docs/features/literal/</guid><description>&lt;h1 id="_tomlリテラル">
&lt;code>_toml&lt;/code>リテラル
&lt;a class="anchor" href="#_toml%e3%83%aa%e3%83%86%e3%83%a9%e3%83%ab">#&lt;/a>
&lt;/h1>
&lt;p>&lt;code>&amp;quot;&amp;quot;_toml&lt;/code>リテラルによって、TOMLファイルをその場でフォーマットできます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;toml.hpp&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">using&lt;/span> &lt;span style="color:#66d9ef">namespace&lt;/span> toml&lt;span style="color:#f92672">::&lt;/span>literals&lt;span style="color:#f92672">::&lt;/span>toml_literals;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">auto&lt;/span> v &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;a = 42&amp;#34;&lt;/span>_toml;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> assert(v.at(&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>).as_integer() &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">42&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>改行を含む場合、生文字列リテラルが便利です。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;toml.hpp&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">using&lt;/span> &lt;span style="color:#66d9ef">namespace&lt;/span> toml&lt;span style="color:#f92672">::&lt;/span>literals&lt;span style="color:#f92672">::&lt;/span>toml_literals;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">auto&lt;/span> v &lt;span style="color:#f92672">=&lt;/span> R&lt;span style="color:#e6db74">&amp;#34;(&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> a &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">42&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> b &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;foo&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> )&lt;span style="color:#e6db74">&amp;#34;_toml;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> assert(v.at(&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>).as_integer() &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">42&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> assert(v.at(&lt;span style="color:#e6db74">&amp;#34;b&amp;#34;&lt;/span>).as_string() &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;foo&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>値が単体で書かれていた場合、その値が返されます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;toml.hpp&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">using&lt;/span> &lt;span style="color:#66d9ef">namespace&lt;/span> toml&lt;span style="color:#f92672">::&lt;/span>literals&lt;span style="color:#f92672">::&lt;/span>toml_literals;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">auto&lt;/span> a &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;42&amp;#34;&lt;/span>_toml;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">auto&lt;/span> b &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;12:34:56&amp;#34;&lt;/span>_toml;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> assert(v.at(&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>).as_integer() &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">42&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> assert(v.at(&lt;span style="color:#e6db74">&amp;#34;b&amp;#34;&lt;/span>).as_local_time().hour &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">12&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> assert(v.at(&lt;span style="color:#e6db74">&amp;#34;b&amp;#34;&lt;/span>).as_local_time().minute &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">34&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> assert(v.at(&lt;span style="color:#e6db74">&amp;#34;b&amp;#34;&lt;/span>).as_local_time().second &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#ae81ff">56&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>TOMLは数値のみからなるキーを許可しています。
よって、&lt;code>[1]&lt;/code>はテーブル名として合法です。&lt;/p></description></item><item><title>toml spec</title><link>https://toruniina.github.io/toml11/ja/docs/features/toml_spec/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://toruniina.github.io/toml11/ja/docs/features/toml_spec/</guid><description>&lt;h1 id="toml言語バージョン">
TOML言語バージョン
&lt;a class="anchor" href="#toml%e8%a8%80%e8%aa%9e%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3">#&lt;/a>
&lt;/h1>
&lt;p>&lt;a href="https://toruniina.github.io/toml11/ja/docs/reference/spec/#tomlspec">&lt;code>toml::spec&lt;/code>&lt;/a>
によって、 &lt;code>toml::parse&lt;/code> や &lt;code>toml::format&lt;/code> で使用するTOML言語のバージョンや、個別の機能フラグを指定することができます。&lt;/p>
&lt;h2 id="tomlのバージョンを指定する">
TOMLのバージョンを指定する
&lt;a class="anchor" href="#toml%e3%81%ae%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b">#&lt;/a>
&lt;/h2>
&lt;p>&lt;a href="https://toruniina.github.io/toml11/ja/docs/reference/spec/#tomlspec">&lt;code>toml::spec&lt;/code>&lt;/a>
&lt;a href="https://toruniina.github.io/toml11/ja/docs/reference/spec/#tomlsemantic_version">&lt;code>toml::semantic_version&lt;/code>&lt;/a>
から構築できます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;toml.hpp&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> toml&lt;span style="color:#f92672">::&lt;/span>spec spec(toml&lt;span style="color:#f92672">::&lt;/span>semantic_version(&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>ですがこれは長いので、&lt;code>toml::spec::v()&lt;/code>関数が用意されています。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;toml.hpp&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> toml&lt;span style="color:#f92672">::&lt;/span>spec spec &lt;span style="color:#f92672">=&lt;/span> toml&lt;span style="color:#f92672">::&lt;/span>spec&lt;span style="color:#f92672">::&lt;/span>v(&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>特に指定しない場合、デフォルトの値で構築する &lt;code>toml::spec::default_version()&lt;/code> が使用されます。&lt;/p>
&lt;p>デフォルトの値はtoml11のバージョンによって変わりますが、その時点でリリースされているTOML言語の最新バージョンに追従します。&lt;/p>
&lt;p>v4.4.0現在、TOML v1.1.0はまだリリースされていないため、デフォルトのTOMLバージョンはv1.0.0です。&lt;/p>
&lt;blockquote class="book-hint warning">
&lt;p>TOML v1.1.0の一部の機能にはかなり長い議論が続いており、まだ差し戻される可能性があります。&lt;/p>
&lt;p>実際に差し戻された場合、toml11はマイナーバージョンアップでそれらの機能を削除、もしくは対応するそれ以降のバージョンに移動します。&lt;/p>
&lt;p>そのような意味で、将来のバージョンに関する機能は全て不安定なものと考えてください。&lt;/p>
&lt;/blockquote>
&lt;h3 id="バージョン指定でパースする">
バージョン指定でパースする
&lt;a class="anchor" href="#%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e6%8c%87%e5%ae%9a%e3%81%a7%e3%83%91%e3%83%bc%e3%82%b9%e3%81%99%e3%82%8b">#&lt;/a>
&lt;/h3>
&lt;p>&lt;a href="https://toruniina.github.io/toml11/ja/docs/reference/parser/">&lt;code>toml::parse&lt;/code>&lt;/a>
のオーバーロードは、ファイル名に続いて&lt;code>toml::spec&lt;/code>を受け取ります。&lt;/p>
&lt;p>これによって、使用するTOMLバージョンを変更できます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;toml.hpp&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> toml&lt;span style="color:#f92672">::&lt;/span>value input &lt;span style="color:#f92672">=&lt;/span> toml&lt;span style="color:#f92672">::&lt;/span>parse(&lt;span style="color:#e6db74">&amp;#34;input.toml&amp;#34;&lt;/span>, toml&lt;span style="color:#f92672">::&lt;/span>spec&lt;span style="color:#f92672">::&lt;/span>v(&lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">1&lt;/span>, &lt;span style="color:#ae81ff">0&lt;/span>));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="バージョン指定でシリアライズする">
バージョン指定でシリアライズする
&lt;a class="anchor" href="#%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e6%8c%87%e5%ae%9a%e3%81%a7%e3%82%b7%e3%83%aa%e3%82%a2%e3%83%a9%e3%82%a4%e3%82%ba%e3%81%99%e3%82%8b">#&lt;/a>
&lt;/h3>
&lt;p>&lt;a href="https://toruniina.github.io/toml11/ja/docs/reference/serializer/">&lt;code>toml::format&lt;/code>&lt;/a>
のオーバーロードは、 &lt;code>toml::value&lt;/code> に続いて &lt;code>toml::spec&lt;/code> を受け取ります。&lt;/p></description></item><item><title>extension</title><link>https://toruniina.github.io/toml11/ja/docs/features/extension/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://toruniina.github.io/toml11/ja/docs/features/extension/</guid><description>&lt;h1 id="toml言語拡張">
TOML言語拡張
&lt;a class="anchor" href="#toml%e8%a8%80%e8%aa%9e%e6%8b%a1%e5%bc%b5">#&lt;/a>
&lt;/h1>
&lt;p>TOML言語は現在 v1.0.0 が最新版ですが、その後もいくつかの新機能が議論の末マージされ、
v1.1.0に向けて議論が続いています。&lt;/p>
&lt;p>そこで議論された機能の中には、有用なケースが少ないと考えられたものや、
提案された際の方向性では導入が難しいもの、導入がされなかったものも多くあります。&lt;/p>
&lt;p>toml11では、そのような機能のなかからいくつかを選んで、実験的に実装を行っています。
これらはtoml11ではサポートされていますが、他のパーサではサポートされておらず、また
サポートされる予定もないことに注意してください。&lt;/p>
&lt;p>また、これらの機能はデフォルトで使用されない設定になっており、
使用するためには機能フラグをそれぞれ &lt;code>true&lt;/code> にしなければなりません。
非標準の機能なので、あえて明示的に書かなければ使えないように設計しています。&lt;/p>
&lt;p>いくつかの機能は今後TOML言語自体に新機能としてマージされる可能性があります。
もし以下の拡張機能を完全に置き換えられる機能が導入された場合、拡張機能は
本来の機能の実装後にマイナーバージョンアップで削除される可能性があります。&lt;/p>
&lt;h2 id="null">
&lt;code>null&lt;/code>
&lt;a class="anchor" href="#null">#&lt;/a>
&lt;/h2>
&lt;p>TOMLファイル内で値として&lt;code>null&lt;/code>を使えるようになります。&lt;/p>
&lt;pre tabindex="0">&lt;code>a = null
b = [ 1, 2, 3, null, 5]
&lt;/code>&lt;/pre>&lt;p>これを使用するには、 &lt;code>toml::spec&lt;/code> の &lt;code>ext_null_value&lt;/code> を &lt;code>true&lt;/code> にします。&lt;/p>
&lt;p>パースすると、デフォルト構築した場合と同様の &lt;code>toml::value_t::empty&lt;/code> となります。
ただし、ファイル内の位置情報は設定されます。&lt;/p>
&lt;p>&lt;code>null&lt;/code> は値の文脈でのみパースされるので、キーに &lt;code>null&lt;/code> を使用した際はこれまで通り
&lt;code>&amp;quot;null&amp;quot;&lt;/code> という文字列のキーとして解釈されます。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-cpp" data-lang="cpp">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;toml.hpp&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> toml&lt;span style="color:#f92672">::&lt;/span>spec spec;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> spec.ext_null_value &lt;span style="color:#f92672">=&lt;/span> true;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#66d9ef">auto&lt;/span> v &lt;span style="color:#f92672">=&lt;/span> toml&lt;span style="color:#f92672">::&lt;/span>parse_str(&lt;span style="color:#e6db74">&amp;#34;a = null&amp;#34;&lt;/span>, spec);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> assert(v.at(&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>).is_empty());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> assert(v.at(&lt;span style="color:#e6db74">&amp;#34;a&amp;#34;&lt;/span>).is(toml&lt;span style="color:#f92672">::&lt;/span>value_t&lt;span style="color:#f92672">::&lt;/span>empty));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="浮動小数点数の16進数フォーマット">
浮動小数点数の16進数フォーマット
&lt;a class="anchor" href="#%e6%b5%ae%e5%8b%95%e5%b0%8f%e6%95%b0%e7%82%b9%e6%95%b0%e3%81%ae16%e9%80%b2%e6%95%b0%e3%83%95%e3%82%a9%e3%83%bc%e3%83%9e%e3%83%83%e3%83%88">#&lt;/a>
&lt;/h2>
&lt;p>TOMLファイル内で浮動小数点数に16進数フォーマットを使用できるようになります。&lt;/p></description></item></channel></rss>

View File

@@ -0,0 +1,127 @@
<!doctype html><html lang=ja dir=ltr><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content='
_tomlリテラル
#
""_tomlリテラルによって、TOMLファイルをその場でフォーマットできます。
#include <toml.hpp>
int main()
{
using namespace toml::literals::toml_literals;
const auto v = "a = 42"_toml;
assert(v.at("a").as_integer() == 42);
return 0;
}
改行を含む場合、生文字列リテラルが便利です。
#include <toml.hpp>
int main()
{
using namespace toml::literals::toml_literals;
const auto v = R"(
a = 42
b = "foo"
)"_toml;
assert(v.at("a").as_integer() == 42);
assert(v.at("b").as_string() == "foo");
return 0;
}
値が単体で書かれていた場合、その値が返されます。
#include <toml.hpp>
int main()
{
using namespace toml::literals::toml_literals;
const auto a = "42"_toml;
const auto b = "12:34:56"_toml;
assert(v.at("a").as_integer() == 42);
assert(v.at("b").as_local_time().hour == 12);
assert(v.at("b").as_local_time().minute == 34);
assert(v.at("b").as_local_time().second == 56);
return 0;
}
TOMLは数値のみからなるキーを許可しています。
よって、[1]はテーブル名として合法です。'><meta name=theme-color media="(prefers-color-scheme: light)" content="#ffffff"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#343a40"><meta name=color-scheme content="light dark"><meta property="og:url" content="https://toruniina.github.io/toml11/ja/docs/features/literal/"><meta property="og:site_name" content="toml11"><meta property="og:title" content="toml literal"><meta property="og:description" content='_tomlリテラル # ""_tomlリテラルによって、TOMLファイルをその場でフォーマットできます。
#include <toml.hpp> int main() { using namespace toml::literals::toml_literals; const auto v = "a = 42"_toml; assert(v.at("a").as_integer() == 42); return 0; } 改行を含む場合、生文字列リテラルが便利です。
#include <toml.hpp> int main() { using namespace toml::literals::toml_literals; const auto v = R"( a = 42 b = "foo" )"_toml; assert(v.at("a").as_integer() == 42); assert(v.at("b").as_string() == "foo"); return 0; } 値が単体で書かれていた場合、その値が返されます。
#include <toml.hpp> int main() { using namespace toml::literals::toml_literals; const auto a = "42"_toml; const auto b = "12:34:56"_toml; assert(v.at("a").as_integer() == 42); assert(v.at("b").as_local_time().hour == 12); assert(v.at("b").as_local_time().minute == 34); assert(v.at("b").as_local_time().second == 56); return 0; } TOMLは数値のみからなるキーを許可しています。 よって、[1]はテーブル名として合法です。'><meta property="og:locale" content="ja"><meta property="og:type" content="article"><meta property="article:section" content="docs"><title>toml literal | toml11</title>
<link rel=manifest href=/toml11/manifest.json><link rel=icon href=/toml11/favicon.png><link rel=canonical href=https://toruniina.github.io/toml11/ja/docs/features/literal/><link rel=alternate hreflang=en href=https://toruniina.github.io/toml11/docs/features/literal/ title="toml literal"><link rel=stylesheet href=/toml11/book.min.ddac3efe7ea4c1007ff53e5a8fd67f12517e5d2e99984d8c67a18668f7ecaa03.css integrity="sha256-3aw+/n6kwQB/9T5aj9Z/ElF+XS6ZmE2MZ6GGaPfsqgM=" crossorigin=anonymous><script defer src=/toml11/fuse.min.js></script><script defer src=/toml11/ja.search.min.13aefbf6a803b591c02d5bc9a01dfe65fe37c31e2915c91573708d38e805d86c.js integrity="sha256-E6779qgDtZHALVvJoB3+Zf43wx4pFckVc3CNOOgF2Gw=" crossorigin=anonymous></script></head><body dir=ltr><input type=checkbox class="hidden toggle" id=menu-control>
<input type=checkbox class="hidden toggle" id=toc-control><main class="container flex"><aside class=book-menu><div class=book-menu-content><nav><h2 class=book-brand><a class="flex align-center" href=/toml11/ja/><span>toml11</span></a></h2><div class="book-search hidden"><input type=text id=book-search-input placeholder=検索 aria-label=検索 maxlength=64 data-hotkeys=s/><div class="book-search-spinner hidden"></div><ul id=book-search-results></ul></div><script>document.querySelector(".book-search").classList.remove("hidden")</script><ul class=book-languages><li><input type=checkbox id=languages class=toggle>
<label for=languages class="flex justify-between"><a role=button class="flex align-center"><img src=/toml11/svg/translate.svg class=book-icon alt=Languages>
日本語</a></label><ul><li><a href=https://toruniina.github.io/toml11/docs/features/literal/>English</a></li></ul></li></ul><ul><li><a href=/toml11/ja/docs/installation/>installation</a><ul></ul></li><li><input type=checkbox id=section-b4cfb5b55e913a8d853eacf5e8fba05f class=toggle checked>
<label for=section-b4cfb5b55e913a8d853eacf5e8fba05f class="flex justify-between"><a href=/toml11/ja/docs/features/>features</a></label><ul><li><a href=/toml11/ja/docs/features/parsing_files/>parsing files</a></li><li><a href=/toml11/ja/docs/features/value/>getting values</a></li><li><a href=/toml11/ja/docs/features/error_message/>error message</a></li><li><a href=/toml11/ja/docs/features/serialize/>serializing values</a></li><li><a href=/toml11/ja/docs/features/configure_types/>configuring types</a></li><li><a href=/toml11/ja/docs/features/literal/ class=active>toml literal</a></li><li><a href=/toml11/ja/docs/features/toml_spec/>toml spec</a></li><li><a href=/toml11/ja/docs/features/extension/>extension</a></li></ul></li><li><input type=checkbox id=section-01b096afc5186aea96713b408b47c967 class=toggle>
<label for=section-01b096afc5186aea96713b408b47c967 class="flex justify-between"><a href=/toml11/ja/docs/reference/>reference</a></label><ul><li><a href=/toml11/ja/docs/reference/color/>color.hpp</a></li><li><a href=/toml11/ja/docs/reference/comments/>comments.hpp</a></li><li><a href=/toml11/ja/docs/reference/conversion/>conversion.hpp</a></li><li><a href=/toml11/ja/docs/reference/datetime/>datetime.hpp</a></li><li><a href=/toml11/ja/docs/reference/error_info/>error_info.hpp</a></li><li><a href=/toml11/ja/docs/reference/exception/>exception.hpp</a></li><li><a href=/toml11/ja/docs/reference/find/>find.hpp</a></li><li><a href=/toml11/ja/docs/reference/format/>format.hpp</a></li><li><a href=/toml11/ja/docs/reference/from/>from.hpp</a></li><li><a href=/toml11/ja/docs/reference/get/>get.hpp</a></li><li><a href=/toml11/ja/docs/reference/into/>into.hpp</a></li><li><a href=/toml11/ja/docs/reference/literal/>literal.hpp</a></li><li><a href=/toml11/ja/docs/reference/ordered_map/>ordered_map.hpp</a></li><li><a href=/toml11/ja/docs/reference/parser/>parser.hpp</a></li><li><a href=/toml11/ja/docs/reference/result/>result.hpp</a></li><li><a href=/toml11/ja/docs/reference/serializer/>serializer.hpp</a></li><li><a href=/toml11/ja/docs/reference/source_location/>source_location.hpp</a></li><li><a href=/toml11/ja/docs/reference/spec/>spec.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml_fwd/>toml_fwd.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml/>toml.hpp</a></li><li><a href=/toml11/ja/docs/reference/types/>types.hpp</a></li><li><a href=/toml11/ja/docs/reference/value_t/>value_t.hpp</a></li><li><a href=/toml11/ja/docs/reference/value/>value.hpp</a></li><li><a href=/toml11/ja/docs/reference/version/>version.hpp</a></li><li><a href=/toml11/ja/docs/reference/visit/>visit.hpp</a></li></ul></li><li><a href=/toml11/ja/docs/changelog/>changelog</a><ul></ul></li></ul><ul><li><a href=https://github.com/ToruNiina/toml11 target=_blank rel=noopener>GitHub</a></li></ul></nav><script>(function(){var e=document.querySelector("aside .book-menu-content");addEventListener("beforeunload",function(){localStorage.setItem("menu.scrollTop",e.scrollTop)}),e.scrollTop=localStorage.getItem("menu.scrollTop")})()</script></div></aside><div class=book-page><header class=book-header><div class="flex align-center justify-between"><label for=menu-control><img src=/toml11/svg/menu.svg class=book-icon alt=Menu>
</label><strong>toml literal</strong>
<label for=toc-control><img src=/toml11/svg/toc.svg class=book-icon alt="Table of Contents"></label></div><aside class="hidden clearfix"><nav id=TableOfContents><ul><li><a href=#_tomlリテラル><code>_toml</code>リテラル</a></li></ul></nav></aside></header><article class="markdown book-article"><h1 id=_tomlリテラル><code>_toml</code>リテラル
<a class=anchor href=#_toml%e3%83%aa%e3%83%86%e3%83%a9%e3%83%ab>#</a></h1><p><code>""_toml</code>リテラルによって、TOMLファイルをその場でフォーマットできます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> <span style=color:#66d9ef>namespace</span> toml<span style=color:#f92672>::</span>literals<span style=color:#f92672>::</span>toml_literals;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> v <span style=color:#f92672>=</span> <span style=color:#e6db74>&#34;a = 42&#34;</span>_toml;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> assert(v.at(<span style=color:#e6db74>&#34;a&#34;</span>).as_integer() <span style=color:#f92672>==</span> <span style=color:#ae81ff>42</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>改行を含む場合、生文字列リテラルが便利です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> <span style=color:#66d9ef>namespace</span> toml<span style=color:#f92672>::</span>literals<span style=color:#f92672>::</span>toml_literals;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> v <span style=color:#f92672>=</span> R<span style=color:#e6db74>&#34;(</span>
</span></span><span style=display:flex><span> a <span style=color:#f92672>=</span> <span style=color:#ae81ff>42</span>
</span></span><span style=display:flex><span> b <span style=color:#f92672>=</span> <span style=color:#e6db74>&#34;foo&#34;</span>
</span></span><span style=display:flex><span> )<span style=color:#e6db74>&#34;_toml;</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> assert(v.at(<span style=color:#e6db74>&#34;a&#34;</span>).as_integer() <span style=color:#f92672>==</span> <span style=color:#ae81ff>42</span>);
</span></span><span style=display:flex><span> assert(v.at(<span style=color:#e6db74>&#34;b&#34;</span>).as_string() <span style=color:#f92672>==</span> <span style=color:#e6db74>&#34;foo&#34;</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>値が単体で書かれていた場合、その値が返されます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> <span style=color:#66d9ef>namespace</span> toml<span style=color:#f92672>::</span>literals<span style=color:#f92672>::</span>toml_literals;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a <span style=color:#f92672>=</span> <span style=color:#e6db74>&#34;42&#34;</span>_toml;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> b <span style=color:#f92672>=</span> <span style=color:#e6db74>&#34;12:34:56&#34;</span>_toml;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> assert(v.at(<span style=color:#e6db74>&#34;a&#34;</span>).as_integer() <span style=color:#f92672>==</span> <span style=color:#ae81ff>42</span>);
</span></span><span style=display:flex><span> assert(v.at(<span style=color:#e6db74>&#34;b&#34;</span>).as_local_time().hour <span style=color:#f92672>==</span> <span style=color:#ae81ff>12</span>);
</span></span><span style=display:flex><span> assert(v.at(<span style=color:#e6db74>&#34;b&#34;</span>).as_local_time().minute <span style=color:#f92672>==</span> <span style=color:#ae81ff>34</span>);
</span></span><span style=display:flex><span> assert(v.at(<span style=color:#e6db74>&#34;b&#34;</span>).as_local_time().second <span style=color:#f92672>==</span> <span style=color:#ae81ff>56</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>TOMLは数値のみからなるキーを許可しています。
よって、<code>[1]</code>はテーブル名として合法です。</p><p><code>[1]</code>のようにテーブル定義と配列の区別がつかない場合、テーブル定義が優先されます。</p><p>配列として解釈させるには、trailing commaを使用してください。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>using</span> <span style=color:#66d9ef>namespace</span> toml<span style=color:#f92672>::</span>literals<span style=color:#f92672>::</span>toml_literals;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> t <span style=color:#f92672>=</span> <span style=color:#e6db74>&#34;[1]&#34;</span>_toml; <span style=color:#75715e>// {1 = {}}
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a <span style=color:#f92672>=</span> <span style=color:#e6db74>&#34;[1,]&#34;</span>_toml; <span style=color:#75715e>// [1,]
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span> assert(t.is_table());
</span></span><span style=display:flex><span> assert(t.at(<span style=color:#e6db74>&#34;1&#34;</span>).is_table());
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> assert(a.is_array());
</span></span><span style=display:flex><span> assert(a.at(<span style=color:#ae81ff>0</span>).as_integer() <span style=color:#f92672>==</span> <span style=color:#ae81ff>1</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div></article><footer class=book-footer><div class="flex flex-wrap justify-between"></div><script>(function(){function e(e){const t=window.getSelection(),n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}document.querySelectorAll("pre code").forEach(t=>{t.addEventListener("click",function(){if(window.getSelection().toString())return;e(t.parentElement),navigator.clipboard&&navigator.clipboard.writeText(t.parentElement.textContent)})})})()</script></footer><label for=menu-control class="hidden book-menu-overlay"></label></div><aside class=book-toc><div class=book-toc-content><nav id=TableOfContents><ul><li><a href=#_tomlリテラル><code>_toml</code>リテラル</a></li></ul></nav></div></aside></main></body></html>

View File

@@ -0,0 +1,233 @@
<!doctype html><html lang=ja dir=ltr><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content='
ファイル・文字列をパースする
#
toml11では、toml::parse や toml::try_parse を使って、ファイルや文字列、バイト列をパースすることができます。
これらは成功時に toml::value を返します。
ファイルは常にテーブルになりますが、返り値が toml::table でないことに気を付けてください。
toml::value はファイルに関するメタデータを持っており、
toml::table は std::unordered_map<std::stirng, toml::value> のエイリアスでしかありません。
メタデータを返すために、 toml::table ではなく toml::value を返しています。
ファイルのルートに対応する toml::value は常に table_type を持ちます。
ファイルをパースする
#
ファイルをパースする際は、
toml::parse
または
toml::try_parse
を使います。
toml::parse
#
std::stringでファイル名を指定する
#
toml::parse
は、文字列でファイル名を受け取り、そのファイルを開いてパースします。
以下のサンプルは、input.tomlというファイルをパースし、titleという変数を文字列として取り出し、出力するコードです。
#include <toml.hpp>
#include <iostream>
int main()
{
const toml::value input = toml::parse("input.toml");
std::cout << input.at("title").as_string() << std::endl;
return 0;
}
std::filesystem::pathでファイルを指定する
#
toml::parse
には、std::filesystem::pathを渡すことも可能です。
当然ですが、<filesystem>がサポートされるC++17以降でなければ使用できません。
std::istreamで入力ストリームを指定する
#
toml::parse
には、std::istreamを渡すことも可能です。'><meta name=theme-color media="(prefers-color-scheme: light)" content="#ffffff"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#343a40"><meta name=color-scheme content="light dark"><meta property="og:url" content="https://toruniina.github.io/toml11/ja/docs/features/parsing_files/"><meta property="og:site_name" content="toml11"><meta property="og:title" content="parsing files"><meta property="og:description" content='ファイル・文字列をパースする # toml11では、toml::parse や toml::try_parse を使って、ファイルや文字列、バイト列をパースすることができます。
これらは成功時に toml::value を返します。 ファイルは常にテーブルになりますが、返り値が toml::table でないことに気を付けてください。 toml::value はファイルに関するメタデータを持っており、 toml::table は std::unordered_map<std::stirng, toml::value> のエイリアスでしかありません。 メタデータを返すために、 toml::table ではなく toml::value を返しています。 ファイルのルートに対応する toml::value は常に table_type を持ちます。
ファイルをパースする # ファイルをパースする際は、 toml::parse または toml::try_parse を使います。
toml::parse # std::stringでファイル名を指定する # toml::parse は、文字列でファイル名を受け取り、そのファイルを開いてパースします。
以下のサンプルは、input.tomlというファイルをパースし、titleという変数を文字列として取り出し、出力するコードです。
#include <toml.hpp> #include <iostream> int main() { const toml::value input = toml::parse("input.toml"); std::cout << input.at("title").as_string() << std::endl; return 0; } std::filesystem::pathでファイルを指定する # toml::parse には、std::filesystem::pathを渡すことも可能です。
当然ですが、<filesystem>がサポートされるC++17以降でなければ使用できません。
std::istreamで入力ストリームを指定する # toml::parse には、std::istreamを渡すことも可能です。'><meta property="og:locale" content="ja"><meta property="og:type" content="article"><meta property="article:section" content="docs"><title>parsing files | toml11</title>
<link rel=manifest href=/toml11/manifest.json><link rel=icon href=/toml11/favicon.png><link rel=canonical href=https://toruniina.github.io/toml11/ja/docs/features/parsing_files/><link rel=alternate hreflang=en href=https://toruniina.github.io/toml11/docs/features/parsing_files/ title="parsing files"><link rel=stylesheet href=/toml11/book.min.ddac3efe7ea4c1007ff53e5a8fd67f12517e5d2e99984d8c67a18668f7ecaa03.css integrity="sha256-3aw+/n6kwQB/9T5aj9Z/ElF+XS6ZmE2MZ6GGaPfsqgM=" crossorigin=anonymous><script defer src=/toml11/fuse.min.js></script><script defer src=/toml11/ja.search.min.13aefbf6a803b591c02d5bc9a01dfe65fe37c31e2915c91573708d38e805d86c.js integrity="sha256-E6779qgDtZHALVvJoB3+Zf43wx4pFckVc3CNOOgF2Gw=" crossorigin=anonymous></script></head><body dir=ltr><input type=checkbox class="hidden toggle" id=menu-control>
<input type=checkbox class="hidden toggle" id=toc-control><main class="container flex"><aside class=book-menu><div class=book-menu-content><nav><h2 class=book-brand><a class="flex align-center" href=/toml11/ja/><span>toml11</span></a></h2><div class="book-search hidden"><input type=text id=book-search-input placeholder=検索 aria-label=検索 maxlength=64 data-hotkeys=s/><div class="book-search-spinner hidden"></div><ul id=book-search-results></ul></div><script>document.querySelector(".book-search").classList.remove("hidden")</script><ul class=book-languages><li><input type=checkbox id=languages class=toggle>
<label for=languages class="flex justify-between"><a role=button class="flex align-center"><img src=/toml11/svg/translate.svg class=book-icon alt=Languages>
日本語</a></label><ul><li><a href=https://toruniina.github.io/toml11/docs/features/parsing_files/>English</a></li></ul></li></ul><ul><li><a href=/toml11/ja/docs/installation/>installation</a><ul></ul></li><li><input type=checkbox id=section-b4cfb5b55e913a8d853eacf5e8fba05f class=toggle checked>
<label for=section-b4cfb5b55e913a8d853eacf5e8fba05f class="flex justify-between"><a href=/toml11/ja/docs/features/>features</a></label><ul><li><a href=/toml11/ja/docs/features/parsing_files/ class=active>parsing files</a></li><li><a href=/toml11/ja/docs/features/value/>getting values</a></li><li><a href=/toml11/ja/docs/features/error_message/>error message</a></li><li><a href=/toml11/ja/docs/features/serialize/>serializing values</a></li><li><a href=/toml11/ja/docs/features/configure_types/>configuring types</a></li><li><a href=/toml11/ja/docs/features/literal/>toml literal</a></li><li><a href=/toml11/ja/docs/features/toml_spec/>toml spec</a></li><li><a href=/toml11/ja/docs/features/extension/>extension</a></li></ul></li><li><input type=checkbox id=section-01b096afc5186aea96713b408b47c967 class=toggle>
<label for=section-01b096afc5186aea96713b408b47c967 class="flex justify-between"><a href=/toml11/ja/docs/reference/>reference</a></label><ul><li><a href=/toml11/ja/docs/reference/color/>color.hpp</a></li><li><a href=/toml11/ja/docs/reference/comments/>comments.hpp</a></li><li><a href=/toml11/ja/docs/reference/conversion/>conversion.hpp</a></li><li><a href=/toml11/ja/docs/reference/datetime/>datetime.hpp</a></li><li><a href=/toml11/ja/docs/reference/error_info/>error_info.hpp</a></li><li><a href=/toml11/ja/docs/reference/exception/>exception.hpp</a></li><li><a href=/toml11/ja/docs/reference/find/>find.hpp</a></li><li><a href=/toml11/ja/docs/reference/format/>format.hpp</a></li><li><a href=/toml11/ja/docs/reference/from/>from.hpp</a></li><li><a href=/toml11/ja/docs/reference/get/>get.hpp</a></li><li><a href=/toml11/ja/docs/reference/into/>into.hpp</a></li><li><a href=/toml11/ja/docs/reference/literal/>literal.hpp</a></li><li><a href=/toml11/ja/docs/reference/ordered_map/>ordered_map.hpp</a></li><li><a href=/toml11/ja/docs/reference/parser/>parser.hpp</a></li><li><a href=/toml11/ja/docs/reference/result/>result.hpp</a></li><li><a href=/toml11/ja/docs/reference/serializer/>serializer.hpp</a></li><li><a href=/toml11/ja/docs/reference/source_location/>source_location.hpp</a></li><li><a href=/toml11/ja/docs/reference/spec/>spec.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml_fwd/>toml_fwd.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml/>toml.hpp</a></li><li><a href=/toml11/ja/docs/reference/types/>types.hpp</a></li><li><a href=/toml11/ja/docs/reference/value_t/>value_t.hpp</a></li><li><a href=/toml11/ja/docs/reference/value/>value.hpp</a></li><li><a href=/toml11/ja/docs/reference/version/>version.hpp</a></li><li><a href=/toml11/ja/docs/reference/visit/>visit.hpp</a></li></ul></li><li><a href=/toml11/ja/docs/changelog/>changelog</a><ul></ul></li></ul><ul><li><a href=https://github.com/ToruNiina/toml11 target=_blank rel=noopener>GitHub</a></li></ul></nav><script>(function(){var e=document.querySelector("aside .book-menu-content");addEventListener("beforeunload",function(){localStorage.setItem("menu.scrollTop",e.scrollTop)}),e.scrollTop=localStorage.getItem("menu.scrollTop")})()</script></div></aside><div class=book-page><header class=book-header><div class="flex align-center justify-between"><label for=menu-control><img src=/toml11/svg/menu.svg class=book-icon alt=Menu>
</label><strong>parsing files</strong>
<label for=toc-control><img src=/toml11/svg/toc.svg class=book-icon alt="Table of Contents"></label></div><aside class="hidden clearfix"><nav id=TableOfContents><ul><li><a href=#ファイル文字列をパースする>ファイル・文字列をパースする</a><ul><li><a href=#ファイルをパースする>ファイルをパースする</a><ul><li><a href=#tomlparse><code>toml::parse</code></a></li><li><a href=#tomltry_parse><code>toml::try_parse</code></a></li></ul></li><li><a href=#文字列をパースする>文字列をパースする</a><ul><li><a href=#tomlparse_str><code>toml::parse_str</code></a></li><li><a href=#tomltry_parse_str><code>toml::try_parse_str</code></a></li></ul></li><li><a href=#バイト列をパースする>バイト列をパースする</a><ul><li><a href=#tomlparsestdvectorunsigned-char><code>toml::parse(std::vector&lt;unsigned char>)</code></a></li><li><a href=#tomltry_parsestdvectorunsigned-char><code>toml::try_parse(std::vector&lt;unsigned char>)</code></a></li></ul></li></ul></li></ul></nav></aside></header><article class="markdown book-article"><h1 id=ファイル文字列をパースする>ファイル・文字列をパースする
<a class=anchor href=#%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e3%83%91%e3%83%bc%e3%82%b9%e3%81%99%e3%82%8b>#</a></h1><p>toml11では、<code>toml::parse</code><code>toml::try_parse</code> を使って、ファイルや文字列、バイト列をパースすることができます。</p><p>これらは成功時に <code>toml::value</code> を返します。
ファイルは常にテーブルになりますが、返り値が <code>toml::table</code> でないことに気を付けてください。
<code>toml::value</code> はファイルに関するメタデータを持っており、
<code>toml::table</code><code>std::unordered_map&lt;std::stirng, toml::value></code> のエイリアスでしかありません。
メタデータを返すために、 <code>toml::table</code> ではなく <code>toml::value</code> を返しています。
ファイルのルートに対応する <code>toml::value</code> は常に <code>table_type</code> を持ちます。</p><h2 id=ファイルをパースする>ファイルをパースする
<a class=anchor href=#%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e3%83%91%e3%83%bc%e3%82%b9%e3%81%99%e3%82%8b>#</a></h2><p>ファイルをパースする際は、
<a href=https://toruniina.github.io/toml11/ja/docs/reference/parser/#parse><code>toml::parse</code></a>
または
<a href=https://toruniina.github.io/toml11/ja/docs/reference/parser/#try_parse><code>toml::try_parse</code></a>
を使います。</p><h3 id=tomlparse><code>toml::parse</code>
<a class=anchor href=#tomlparse>#</a></h3><h4 id=stdstringでファイル名を指定する><code>std::string</code>でファイル名を指定する
<a class=anchor href=#stdstring%e3%81%a7%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e5%90%8d%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b>#</a></h4><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/parser/#parse><code>toml::parse</code></a>
は、文字列でファイル名を受け取り、そのファイルを開いてパースします。</p><p>以下のサンプルは、<code>input.toml</code>というファイルをパースし、<code>title</code>という変数を文字列として取り出し、出力するコードです。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;iostream&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value input <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse(<span style=color:#e6db74>&#34;input.toml&#34;</span>);
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> input.at(<span style=color:#e6db74>&#34;title&#34;</span>).as_string() <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h4 id=stdfilesystempathでファイルを指定する><code>std::filesystem::path</code>でファイルを指定する
<a class=anchor href=#stdfilesystempath%e3%81%a7%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b>#</a></h4><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/parser/#parse><code>toml::parse</code></a>
には、<code>std::filesystem::path</code>を渡すことも可能です。</p><p>当然ですが、<code>&lt;filesystem></code>がサポートされるC++17以降でなければ使用できません。</p><h4 id=stdistreamで入力ストリームを指定する><code>std::istream</code>で入力ストリームを指定する
<a class=anchor href=#stdistream%e3%81%a7%e5%85%a5%e5%8a%9b%e3%82%b9%e3%83%88%e3%83%aa%e3%83%bc%e3%83%a0%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b>#</a></h4><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/parser/#parse><code>toml::parse</code></a>
には、<code>std::istream</code>を渡すことも可能です。</p><p>標準ライブラリが改行文字を自動変換することによるファイルサイズと文字数との不整合を避けるため、
<code>std::ios::binary</code>を使ってバイナリモードで開いてください。</p><p>その際、ファイル名の情報がなくなるため、エラーメッセージ中では <code>"unknown file"</code> となります。</p><p>これを避けるため、 <code>std::istream</code> を取る場合は第二引数に <code>std::string</code> でファイル名を取ることもできます。</p><p><code>std::ifstream</code> 以外にも、 <code>std::istringstream</code> 等の別の<code>istream</code>を受け取ることができます。
ただし、呼び出した時点で内容が全て読み込める必要があります。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;iostream&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string filename(<span style=color:#e6db74>&#34;input.toml&#34;</span>);
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>ifstream ifs(filename);
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value input <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse(ifs, filename);
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> input.at(<span style=color:#e6db74>&#34;title&#34;</span>).as_string() <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h4 id=fileでファイルを指定する><code>FILE*</code>でファイルを指定する
<a class=anchor href=#file%e3%81%a7%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b>#</a></h4><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/parser/#parse><code>toml::parse</code></a>
には、<code>FILE*</code>を渡すことも可能です。</p><p>標準ライブラリによる改行文字の自動変換によるファイルサイズと文字数との不整合を避けるため、
<code>fopen("example.toml", "rb")</code>のようにしてバイナリモードで開いてください。</p><p>この場合も、<code>std::istream</code>のときと同様に、第二引数に文字列でファイル名を与える必要があります。</p><p><code>FILE*</code>を渡した場合、ファイルの読み込みに失敗した際には<code>errno</code>が報告されます。</p><h4 id=エラー時の挙動>エラー時の挙動
<a class=anchor href=#%e3%82%a8%e3%83%a9%e3%83%bc%e6%99%82%e3%81%ae%e6%8c%99%e5%8b%95>#</a></h4><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/parser/#parse><code>toml::parse</code></a>
は、文法エラーを発見した場合
<a href=https://toruniina.github.io/toml11/ja/docs/reference/parser/#syntax_error><code>toml::syntax_error</code></a>
を送出します。</p><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/parser/#syntax_error><code>toml::syntax_error</code></a>
は、
<a href=https://toruniina.github.io/toml11/ja/docs/reference/exception/><code>toml::exception</code></a>
から派生しており、またそれは<code>std::exception</code>から派生します。</p><p>よって、
<a href=https://toruniina.github.io/toml11/ja/docs/reference/parser/#syntax_error><code>toml::syntax_error</code></a>
からは <code>what()</code> メンバ関数を使ってエラーメッセージを取り出すことができます。</p><p>また、
<a href=https://toruniina.github.io/toml11/ja/docs/reference/parser/#syntax_error><code>toml::syntax_error</code></a>
<a href=https://toruniina.github.io/toml11/ja/docs/reference/error_info/><code>std::vector&lt;toml::error_info></code></a>
を持っており、<code>errors()</code>メンバ関数を使ってそれにアクセスすることもできます。</p><p><code>toml::parse</code> はごく簡単なエラーならスキップして復帰し、複数のエラーを報告しようと努めます。
数値のフォーマットエラー程度なら復帰できることが多いですが、
配列やテーブルの中のエラーは復帰できずに似たようなエラーを複数回報告することもあります。
冗長であると感じた場合は、 <code>std::vector&lt;toml::error_info></code><code>front()</code> だけを使用するようにすると、
確実に問題のある個所に関するメッセージを得られます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#75715e>// parse
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#66d9ef>try</span> {
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value input <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse(<span style=color:#e6db74>&#34;input.toml&#34;</span>);
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> input.at(<span style=color:#e6db74>&#34;title&#34;</span>).as_string() <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> } <span style=color:#66d9ef>catch</span>(<span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>syntax_error<span style=color:#f92672>&amp;</span> err) {
</span></span><span style=display:flex><span> <span style=color:#75715e>// 全てのエラーを報告
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> std<span style=color:#f92672>::</span>cerr <span style=color:#f92672>&lt;&lt;</span> err.what() <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#75715e>// 最初のエラーのみ報告
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> std<span style=color:#f92672>::</span>cerr <span style=color:#f92672>&lt;&lt;</span> err.errors().front() <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=tomltry_parse><code>toml::try_parse</code>
<a class=anchor href=#tomltry_parse>#</a></h3><p><code>toml::parse</code> は失敗時に例外を送出しますが、 <code>toml::try_parse</code> は失敗時に例外を投げません。</p><p>その代わり、返り値が <code>toml::value</code> ではなく <a href=https://toruniina.github.io/toml11/ja/docs/reference/result/#result><code>toml::result&lt;toml::value, std::vector&lt;toml::error_info>></code></a> になります。</p><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/result/#result><code>result</code></a> 型は成功値または失敗値のどちらかを持つ型です。
Rustの <code>Result</code> やHaskellの <code>Either</code> に相当します。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> parse_result <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>try_parse(<span style=color:#e6db74>&#34;input.toml&#34;</span>);
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span>(parse_result.is_ok())
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> parse_result.unwrap().at(<span style=color:#e6db74>&#34;title&#34;</span>).as_string() <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>else</span>
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cerr <span style=color:#f92672>&lt;&lt;</span> parse_result.unwrap_err().at(<span style=color:#ae81ff>0</span>) <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/result/#result><code>result</code></a> 型がどちらの値を保持しているかは
<code>is_ok()</code>, <code>is_err()</code> 関数を使って確認できます。
また、 <code>unwrap()</code>, <code>unwrap_err()</code> によって成功値、失敗値をそれぞれ取り出せます。
<code>unwrap</code> が失敗した場合は、 <code>bad_result_access</code> 例外が送出されます。
<code>as_ok()</code><code>as_err()</code> 関数を使用すると、失敗時には例外が送出されず、未定義動作となります。</p><blockquote class="book-hint warning"><p><code>try_parse</code><code>syntax_error</code><code>file_io_error</code> を投げず、同じ <code>toml::error_info</code>
<code>result</code> の失敗型として返しますが、絶対に例外を投げないわけではありません。</p><p>標準ライブラリ内部でエラーが発生した場合、例えばメモリ不足の際に <code>vector</code>
<code>allocate</code> が失敗した場合などには <code>std::bad_alloc</code> が送出されますが、
<code>toml::try_parse</code> はこれが送出された場合は <code>catch</code> せずに通します。
そのため、それらのような標準ライブラリの内部で発生する例外は送出される恐れがあります。</p></blockquote><h2 id=文字列をパースする>文字列をパースする
<a class=anchor href=#%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e3%83%91%e3%83%bc%e3%82%b9%e3%81%99%e3%82%8b>#</a></h2><h3 id=tomlparse_str><code>toml::parse_str</code>
<a class=anchor href=#tomlparse_str>#</a></h3><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/parser/#parse_str><code>toml::parse_str</code></a>
は、ファイル名ではなくパースする文字列そのものを受け取ります。</p><p>また、エラーメッセージのTOMLファイルの名前に相当する部分には、<code>std::source_location</code>
相当のコンパイラ拡張機能が使用できる場合、 <code>parse_str</code> を呼び出したC++ファイルの名前と行数が代わりに使用されます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;iostream&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value input <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse_str(<span style=color:#e6db74>&#34;title = </span><span style=color:#ae81ff>\&#34;</span><span style=color:#e6db74>parse_str</span><span style=color:#ae81ff>\&#34;</span><span style=color:#e6db74>&#34;</span>);
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> input.at(<span style=color:#e6db74>&#34;title&#34;</span>).as_string() <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=tomltry_parse_str><code>toml::try_parse_str</code>
<a class=anchor href=#tomltry_parse_str>#</a></h3><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/parser/#try_parse_str><code>toml::try_parse_str</code></a>
は、 <code>parse_str</code> と同じくパースする文字列そのものを受け取り、
<code>try_parse</code> と同じくエラーの報告に
<a href=https://toruniina.github.io/toml11/ja/docs/reference/result/#result><code>toml::result</code></a>
を使用します。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;iostream&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> parse_result <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>try_parse_str(<span style=color:#e6db74>&#34;title = </span><span style=color:#ae81ff>\&#34;</span><span style=color:#e6db74>parse_str</span><span style=color:#ae81ff>\&#34;</span><span style=color:#e6db74>&#34;</span>);
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span>(parse_result.is_ok())
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> parse_result.unwrap().at(<span style=color:#e6db74>&#34;title&#34;</span>).as_string() <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>else</span>
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cerr <span style=color:#f92672>&lt;&lt;</span> parse_result.unwrap_err().at(<span style=color:#ae81ff>0</span>) <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h2 id=バイト列をパースする>バイト列をパースする
<a class=anchor href=#%e3%83%90%e3%82%a4%e3%83%88%e5%88%97%e3%82%92%e3%83%91%e3%83%bc%e3%82%b9%e3%81%99%e3%82%8b>#</a></h2><p>ファイルではなくバイト列をパースすることも可能です。</p><p>UTF-8でエンコードされている必要があるため、<code>unsigned char</code>を使っています。</p><h3 id=tomlparsestdvectorunsigned-char><code>toml::parse(std::vector&lt;unsigned char>)</code>
<a class=anchor href=#tomlparsestdvectorunsigned-char>#</a></h3><p>挙動は <a href=https://toruniina.github.io/toml11/ja/docs/reference/parser/#parse><code>toml::parse</code></a> と同一です。</p><p>バイト列をパースする際は、 <code>filename</code> を要求します。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;iostream&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>vector<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>unsigned</span> <span style=color:#66d9ef>char</span><span style=color:#f92672>&gt;</span> bytes{<span style=color:#75715e>/* ... */</span>};
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value input <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse(bytes, <span style=color:#e6db74>&#34;internal bytes&#34;</span>);
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> input.at(<span style=color:#e6db74>&#34;title&#34;</span>).as_string() <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=tomltry_parsestdvectorunsigned-char><code>toml::try_parse(std::vector&lt;unsigned char>)</code>
<a class=anchor href=#tomltry_parsestdvectorunsigned-char>#</a></h3><p>挙動は <a href=https://toruniina.github.io/toml11/ja/docs/reference/parser/#try_parse><code>toml::try_parse</code></a> と同一です。</p><p>バイト列をパースする際は、 <code>filename</code> を要求します。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;iostream&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>vector<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>unsigned</span> <span style=color:#66d9ef>char</span><span style=color:#f92672>&gt;</span> bytes{<span style=color:#75715e>/* ... */</span>};
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> parse_result <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>try_parse(bytes, <span style=color:#e6db74>&#34;internal bytes&#34;</span>);
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span>(parse_result.is_ok())
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> parse_result.unwrap().at(<span style=color:#e6db74>&#34;title&#34;</span>).as_string() <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>else</span>
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cerr <span style=color:#f92672>&lt;&lt;</span> parse_result.unwrap_err().at(<span style=color:#ae81ff>0</span>) <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div></article><footer class=book-footer><div class="flex flex-wrap justify-between"></div><script>(function(){function e(e){const t=window.getSelection(),n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}document.querySelectorAll("pre code").forEach(t=>{t.addEventListener("click",function(){if(window.getSelection().toString())return;e(t.parentElement),navigator.clipboard&&navigator.clipboard.writeText(t.parentElement.textContent)})})})()</script></footer><label for=menu-control class="hidden book-menu-overlay"></label></div><aside class=book-toc><div class=book-toc-content><nav id=TableOfContents><ul><li><a href=#ファイル文字列をパースする>ファイル・文字列をパースする</a><ul><li><a href=#ファイルをパースする>ファイルをパースする</a><ul><li><a href=#tomlparse><code>toml::parse</code></a></li><li><a href=#tomltry_parse><code>toml::try_parse</code></a></li></ul></li><li><a href=#文字列をパースする>文字列をパースする</a><ul><li><a href=#tomlparse_str><code>toml::parse_str</code></a></li><li><a href=#tomltry_parse_str><code>toml::try_parse_str</code></a></li></ul></li><li><a href=#バイト列をパースする>バイト列をパースする</a><ul><li><a href=#tomlparsestdvectorunsigned-char><code>toml::parse(std::vector&lt;unsigned char>)</code></a></li><li><a href=#tomltry_parsestdvectorunsigned-char><code>toml::try_parse(std::vector&lt;unsigned char>)</code></a></li></ul></li></ul></li></ul></nav></div></aside></main></body></html>

View File

@@ -0,0 +1,176 @@
<!doctype html><html lang=ja dir=ltr><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content='
TOMLファイルを出力する
#
toml::format を使うと、 toml::value を文字列にすることができます。
#include <toml.hpp>
#include <cassert>
int main()
{
const toml::value v(toml::table{
{"a", 42},
{"b", "foo"},
});
const std::string s = toml::format(v);
const toml::value u = toml::parse_str(s);
assert(u.at("a").as_integer() == 42);
assert(u.at("b").as_string() == "foo");
return 0;
}
table_type を格納している toml::value が渡されると、それがファイルのルートテーブルとして解釈されます。
もし table_type 以外を格納している toml::value が渡されると、その値だけがフォーマットされます。
一部のフォーマット指定では、キーが渡されていないとフォーマットできないことがあります。
例えば、 toml::array_format::array_of_tables は [[array.of.tables]] の形でフォーマットするので、
キーへのアクセスを要求します。
キーを要求するフォーマット指定の値がキーなしで渡された場合、 toml::serialization_error が送出されます。
他にも、フォーマット指定と矛盾する値が含まれる場合には、 toml::serialization_error が送出されます。
例えば、 integer_format::hex が指定された整数が負の値を持っている場合や、
string_format::literal が指定された文字列が改行を含んでいる場合などです。
フォーマットの指定方法は後述します。
キーを渡して出力する
#
toml::format には std::string としてキーを渡すことが可能です。'><meta name=theme-color media="(prefers-color-scheme: light)" content="#ffffff"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#343a40"><meta name=color-scheme content="light dark"><meta property="og:url" content="https://toruniina.github.io/toml11/ja/docs/features/serialize/"><meta property="og:site_name" content="toml11"><meta property="og:title" content="serializing values"><meta property="og:description" content='TOMLファイルを出力する # toml::format を使うと、 toml::value を文字列にすることができます。
#include <toml.hpp> #include <cassert> int main() { const toml::value v(toml::table{ {"a", 42}, {"b", "foo"}, }); const std::string s = toml::format(v); const toml::value u = toml::parse_str(s); assert(u.at("a").as_integer() == 42); assert(u.at("b").as_string() == "foo"); return 0; } table_type を格納している toml::value が渡されると、それがファイルのルートテーブルとして解釈されます。
もし table_type 以外を格納している toml::value が渡されると、その値だけがフォーマットされます。
一部のフォーマット指定では、キーが渡されていないとフォーマットできないことがあります。 例えば、 toml::array_format::array_of_tables は [[array.of.tables]] の形でフォーマットするので、 キーへのアクセスを要求します。
キーを要求するフォーマット指定の値がキーなしで渡された場合、 toml::serialization_error が送出されます。
他にも、フォーマット指定と矛盾する値が含まれる場合には、 toml::serialization_error が送出されます。 例えば、 integer_format::hex が指定された整数が負の値を持っている場合や、 string_format::literal が指定された文字列が改行を含んでいる場合などです。
フォーマットの指定方法は後述します。
キーを渡して出力する # toml::format には std::string としてキーを渡すことが可能です。'><meta property="og:locale" content="ja"><meta property="og:type" content="article"><meta property="article:section" content="docs"><title>serializing values | toml11</title>
<link rel=manifest href=/toml11/manifest.json><link rel=icon href=/toml11/favicon.png><link rel=canonical href=https://toruniina.github.io/toml11/ja/docs/features/serialize/><link rel=alternate hreflang=en href=https://toruniina.github.io/toml11/docs/features/serialize/ title="serializing values"><link rel=stylesheet href=/toml11/book.min.ddac3efe7ea4c1007ff53e5a8fd67f12517e5d2e99984d8c67a18668f7ecaa03.css integrity="sha256-3aw+/n6kwQB/9T5aj9Z/ElF+XS6ZmE2MZ6GGaPfsqgM=" crossorigin=anonymous><script defer src=/toml11/fuse.min.js></script><script defer src=/toml11/ja.search.min.13aefbf6a803b591c02d5bc9a01dfe65fe37c31e2915c91573708d38e805d86c.js integrity="sha256-E6779qgDtZHALVvJoB3+Zf43wx4pFckVc3CNOOgF2Gw=" crossorigin=anonymous></script></head><body dir=ltr><input type=checkbox class="hidden toggle" id=menu-control>
<input type=checkbox class="hidden toggle" id=toc-control><main class="container flex"><aside class=book-menu><div class=book-menu-content><nav><h2 class=book-brand><a class="flex align-center" href=/toml11/ja/><span>toml11</span></a></h2><div class="book-search hidden"><input type=text id=book-search-input placeholder=検索 aria-label=検索 maxlength=64 data-hotkeys=s/><div class="book-search-spinner hidden"></div><ul id=book-search-results></ul></div><script>document.querySelector(".book-search").classList.remove("hidden")</script><ul class=book-languages><li><input type=checkbox id=languages class=toggle>
<label for=languages class="flex justify-between"><a role=button class="flex align-center"><img src=/toml11/svg/translate.svg class=book-icon alt=Languages>
日本語</a></label><ul><li><a href=https://toruniina.github.io/toml11/docs/features/serialize/>English</a></li></ul></li></ul><ul><li><a href=/toml11/ja/docs/installation/>installation</a><ul></ul></li><li><input type=checkbox id=section-b4cfb5b55e913a8d853eacf5e8fba05f class=toggle checked>
<label for=section-b4cfb5b55e913a8d853eacf5e8fba05f class="flex justify-between"><a href=/toml11/ja/docs/features/>features</a></label><ul><li><a href=/toml11/ja/docs/features/parsing_files/>parsing files</a></li><li><a href=/toml11/ja/docs/features/value/>getting values</a></li><li><a href=/toml11/ja/docs/features/error_message/>error message</a></li><li><a href=/toml11/ja/docs/features/serialize/ class=active>serializing values</a></li><li><a href=/toml11/ja/docs/features/configure_types/>configuring types</a></li><li><a href=/toml11/ja/docs/features/literal/>toml literal</a></li><li><a href=/toml11/ja/docs/features/toml_spec/>toml spec</a></li><li><a href=/toml11/ja/docs/features/extension/>extension</a></li></ul></li><li><input type=checkbox id=section-01b096afc5186aea96713b408b47c967 class=toggle>
<label for=section-01b096afc5186aea96713b408b47c967 class="flex justify-between"><a href=/toml11/ja/docs/reference/>reference</a></label><ul><li><a href=/toml11/ja/docs/reference/color/>color.hpp</a></li><li><a href=/toml11/ja/docs/reference/comments/>comments.hpp</a></li><li><a href=/toml11/ja/docs/reference/conversion/>conversion.hpp</a></li><li><a href=/toml11/ja/docs/reference/datetime/>datetime.hpp</a></li><li><a href=/toml11/ja/docs/reference/error_info/>error_info.hpp</a></li><li><a href=/toml11/ja/docs/reference/exception/>exception.hpp</a></li><li><a href=/toml11/ja/docs/reference/find/>find.hpp</a></li><li><a href=/toml11/ja/docs/reference/format/>format.hpp</a></li><li><a href=/toml11/ja/docs/reference/from/>from.hpp</a></li><li><a href=/toml11/ja/docs/reference/get/>get.hpp</a></li><li><a href=/toml11/ja/docs/reference/into/>into.hpp</a></li><li><a href=/toml11/ja/docs/reference/literal/>literal.hpp</a></li><li><a href=/toml11/ja/docs/reference/ordered_map/>ordered_map.hpp</a></li><li><a href=/toml11/ja/docs/reference/parser/>parser.hpp</a></li><li><a href=/toml11/ja/docs/reference/result/>result.hpp</a></li><li><a href=/toml11/ja/docs/reference/serializer/>serializer.hpp</a></li><li><a href=/toml11/ja/docs/reference/source_location/>source_location.hpp</a></li><li><a href=/toml11/ja/docs/reference/spec/>spec.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml_fwd/>toml_fwd.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml/>toml.hpp</a></li><li><a href=/toml11/ja/docs/reference/types/>types.hpp</a></li><li><a href=/toml11/ja/docs/reference/value_t/>value_t.hpp</a></li><li><a href=/toml11/ja/docs/reference/value/>value.hpp</a></li><li><a href=/toml11/ja/docs/reference/version/>version.hpp</a></li><li><a href=/toml11/ja/docs/reference/visit/>visit.hpp</a></li></ul></li><li><a href=/toml11/ja/docs/changelog/>changelog</a><ul></ul></li></ul><ul><li><a href=https://github.com/ToruNiina/toml11 target=_blank rel=noopener>GitHub</a></li></ul></nav><script>(function(){var e=document.querySelector("aside .book-menu-content");addEventListener("beforeunload",function(){localStorage.setItem("menu.scrollTop",e.scrollTop)}),e.scrollTop=localStorage.getItem("menu.scrollTop")})()</script></div></aside><div class=book-page><header class=book-header><div class="flex align-center justify-between"><label for=menu-control><img src=/toml11/svg/menu.svg class=book-icon alt=Menu>
</label><strong>serializing values</strong>
<label for=toc-control><img src=/toml11/svg/toc.svg class=book-icon alt="Table of Contents"></label></div><aside class="hidden clearfix"><nav id=TableOfContents><ul><li><a href=#tomlファイルを出力する>TOMLファイルを出力する</a><ul><li><a href=#キーを渡して出力する>キーを渡して出力する</a></li><li><a href=#フォーマットを指定する>フォーマットを指定する</a><ul><li><a href=#整数のフォーマットを指定する>整数のフォーマットを指定する</a></li><li><a href=#配列を単一行複数行にする>配列を単一行・複数行にする</a></li><li><a href=#テーブルをインラインテーブルにする>テーブルをインラインテーブルにする</a></li></ul></li><li><a href=#toml言語バージョンを指定して出力する>TOML言語バージョンを指定して出力する</a></li></ul></li></ul></nav></aside></header><article class="markdown book-article"><h1 id=tomlファイルを出力する>TOMLファイルを出力する
<a class=anchor href=#toml%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e5%87%ba%e5%8a%9b%e3%81%99%e3%82%8b>#</a></h1><p><code>toml::format</code> を使うと、 <code>toml::value</code> を文字列にすることができます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;cassert&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value v(toml<span style=color:#f92672>::</span>table{
</span></span><span style=display:flex><span> {<span style=color:#e6db74>&#34;a&#34;</span>, <span style=color:#ae81ff>42</span>},
</span></span><span style=display:flex><span> {<span style=color:#e6db74>&#34;b&#34;</span>, <span style=color:#e6db74>&#34;foo&#34;</span>},
</span></span><span style=display:flex><span> });
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span>string s <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>format(v);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value u <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse_str(s);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> assert(u.at(<span style=color:#e6db74>&#34;a&#34;</span>).as_integer() <span style=color:#f92672>==</span> <span style=color:#ae81ff>42</span>);
</span></span><span style=display:flex><span> assert(u.at(<span style=color:#e6db74>&#34;b&#34;</span>).as_string() <span style=color:#f92672>==</span> <span style=color:#e6db74>&#34;foo&#34;</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p><code>table_type</code> を格納している <code>toml::value</code> が渡されると、それがファイルのルートテーブルとして解釈されます。</p><p>もし <code>table_type</code> 以外を格納している <code>toml::value</code> が渡されると、その値だけがフォーマットされます。</p><p>一部のフォーマット指定では、キーが渡されていないとフォーマットできないことがあります。
例えば、 <code>toml::array_format::array_of_tables</code><code>[[array.of.tables]]</code> の形でフォーマットするので、
キーへのアクセスを要求します。</p><p>キーを要求するフォーマット指定の値がキーなしで渡された場合、 <code>toml::serialization_error</code> が送出されます。</p><p>他にも、フォーマット指定と矛盾する値が含まれる場合には、 <code>toml::serialization_error</code> が送出されます。
例えば、 <code>integer_format::hex</code> が指定された整数が負の値を持っている場合や、
<code>string_format::literal</code> が指定された文字列が改行を含んでいる場合などです。</p><p>フォーマットの指定方法は後述します。</p><h2 id=キーを渡して出力する>キーを渡して出力する
<a class=anchor href=#%e3%82%ad%e3%83%bc%e3%82%92%e6%b8%a1%e3%81%97%e3%81%a6%e5%87%ba%e5%8a%9b%e3%81%99%e3%82%8b>#</a></h2><p><code>toml::format</code> には <code>std::string</code> としてキーを渡すことが可能です。</p><p>その場合、ルートテーブルの下にそのキーがあり、渡した値はそのキーに対応すると解釈されます。</p><p>キーが複数段になる場合、 <code>std::vector&lt;std::string></code> を渡すことができます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;cassert&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value v(toml<span style=color:#f92672>::</span>table{
</span></span><span style=display:flex><span> {<span style=color:#e6db74>&#34;a&#34;</span>, <span style=color:#ae81ff>42</span>},
</span></span><span style=display:flex><span> {<span style=color:#e6db74>&#34;b&#34;</span>, <span style=color:#e6db74>&#34;foo&#34;</span>},
</span></span><span style=display:flex><span> });
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span>string s <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>format(<span style=color:#e6db74>&#34;bar&#34;</span>, v);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value u <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse_str(s);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> assert(u.at(<span style=color:#e6db74>&#34;bar&#34;</span>).at(<span style=color:#e6db74>&#34;a&#34;</span>).as_integer() <span style=color:#f92672>==</span> <span style=color:#ae81ff>42</span>);
</span></span><span style=display:flex><span> assert(u.at(<span style=color:#e6db74>&#34;bar&#34;</span>).at(<span style=color:#e6db74>&#34;b&#34;</span>).as_string() <span style=color:#f92672>==</span> <span style=color:#e6db74>&#34;foo&#34;</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h2 id=フォーマットを指定する>フォーマットを指定する
<a class=anchor href=#%e3%83%95%e3%82%a9%e3%83%bc%e3%83%9e%e3%83%83%e3%83%88%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b>#</a></h2><p><code>toml::value</code> のそれぞれの型には、対応するフォーマット情報型があります。</p><p><code>toml::value::integer_type</code> には <code>toml::integer_format_info</code> が、
<code>toml::value::table_type</code> には <code>toml::table_format_info</code> があります。</p><p>これらは、パースした際に設定され、型が変わらない限り値を変更しても引き継がれます。</p><p>また、 <code>as_integer_fmt()</code><code>as_table_fmt()</code> といったメンバ関数によってアクセスすることができ、
直接編集することが可能です。</p><p>以下ではいくつかの例を挙げて使い方を説明します。</p><p>フォーマットへのアクセス方法は
<a href=https://toruniina.github.io/toml11/ja/docs/reference/value/><code>toml::value</code>のリファレンス</a>を、
フォーマット情報クラスの完全なリストと詳細は
<a href=https://toruniina.github.io/toml11/ja/docs/reference/format/>formatのリファレンス</a>
参照してください。</p><h3 id=整数のフォーマットを指定する>整数のフォーマットを指定する
<a class=anchor href=#%e6%95%b4%e6%95%b0%e3%81%ae%e3%83%95%e3%82%a9%e3%83%bc%e3%83%9e%e3%83%83%e3%83%88%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b>#</a></h3><p>整数は、基数と幅、そして <code>_</code> の位置を指定することができます。</p><p><code>hex</code>, <code>oct</code>, <code>bin</code> のとき、指定された幅に達するまでゼロで埋められます。
<code>dec</code> の場合は幅指定はスペースを追加しますが、これはパースされません。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> toml<span style=color:#f92672>::</span>value v(<span style=color:#ae81ff>0x00C0&#39;FFEE</span>);
</span></span><span style=display:flex><span> v.as_integer_fmt().fmt <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>integer_format<span style=color:#f92672>::</span>hex;
</span></span><span style=display:flex><span> v.as_integer_fmt().width <span style=color:#f92672>=</span> <span style=color:#ae81ff>8</span>;
</span></span><span style=display:flex><span> v.as_integer_fmt().spacer <span style=color:#f92672>=</span> <span style=color:#ae81ff>4</span>;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span>stirng s <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>format(v);
</span></span><span style=display:flex><span> assert(s <span style=color:#f92672>==</span> <span style=color:#e6db74>&#34;0x00C0_FFEE&#34;</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>詳細は、<a href=https://toruniina.github.io/toml11/ja/docs/reference/format/#integer_format>reference</a> を参照してください。</p><h3 id=配列を単一行複数行にする>配列を単一行・複数行にする
<a class=anchor href=#%e9%85%8d%e5%88%97%e3%82%92%e5%8d%98%e4%b8%80%e8%a1%8c%e8%a4%87%e6%95%b0%e8%a1%8c%e3%81%ab%e3%81%99%e3%82%8b>#</a></h3><p>配列には、 <code>toml::array_format::oneline</code><code>toml::array_format::multiline</code> を指定できます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#75715e># oneline</span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>a</span> = [<span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>2</span>, <span style=color:#ae81ff>3</span>, <span style=color:#ae81ff>4</span>, <span style=color:#ae81ff>5</span>]
</span></span><span style=display:flex><span><span style=color:#75715e># multiline</span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>a</span> = [
</span></span><span style=display:flex><span> <span style=color:#ae81ff>1</span>,
</span></span><span style=display:flex><span> <span style=color:#ae81ff>2</span>,
</span></span><span style=display:flex><span> <span style=color:#ae81ff>3</span>,
</span></span><span style=display:flex><span> <span style=color:#ae81ff>4</span>,
</span></span><span style=display:flex><span> <span style=color:#ae81ff>5</span>
</span></span><span style=display:flex><span>]
</span></span></code></pre></div><p><code>multiline</code> のときは、インデントを指定できます。
各要素は <code>body_indent</code> の分だけインデントされ、閉じ括弧 <code>]</code><code>closing_indent</code> の分だけインデントされます。</p><p>文字種は <code>indent_type</code> で指定され、 <code>toml::indent_char::space</code> または <code>toml::indent_char::tab</code> が選択できます。</p><blockquote class="book-hint warning"><p>インデントに使用する文字種は統一してください。</p><p>一つのファイル内でインデントに異なる文字種が指定された場合、結果は未規定になります。
何らかのインデントがされますが、全ての箇所で文字種やインデントの深さは不定となります。</p></blockquote><p>また、 <code>array</code> の要素が全て <code>table_type</code> を持つ場合、
<code>toml::array_format::array_of_tables</code> が指定できます。</p><p><code>array_of_tables</code> を指定せずに <code>multiline</code> にした場合、テーブルはインラインテーブルになります。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#75715e># multiline</span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>a</span> = [
</span></span><span style=display:flex><span> {<span style=color:#a6e22e>foo</span> = <span style=color:#ae81ff>42</span>},
</span></span><span style=display:flex><span> {<span style=color:#a6e22e>bar</span> = <span style=color:#e6db74>&#34;hoge&#34;</span>},
</span></span><span style=display:flex><span>]
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#75715e># array_of_tables</span>
</span></span><span style=display:flex><span>[[<span style=color:#a6e22e>a</span>]]
</span></span><span style=display:flex><span><span style=color:#a6e22e>foo</span> = <span style=color:#ae81ff>42</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>[[<span style=color:#a6e22e>a</span>]]
</span></span><span style=display:flex><span><span style=color:#a6e22e>bar</span> = <span style=color:#e6db74>&#34;hoge&#34;</span>
</span></span></code></pre></div><p>デフォルトでは、 <code>toml::array_format::default_format</code> が指定されます。
これは適したフォーマットを自動的に選択します。</p><p>例えば、 <code>default_format</code> で全要素が <code>table_type</code> だった場合、 <code>array_of_tables</code> が選択されます。
また、十分短い配列は <code>oneline</code> に、長い配列またはネストされた配列などの複雑な配列は <code>multiline</code> になります。</p><p>詳細は、<a href=https://toruniina.github.io/toml11/ja/docs/reference/format/#array_format>reference</a> を参照してください。</p><h3 id=テーブルをインラインテーブルにする>テーブルをインラインテーブルにする
<a class=anchor href=#%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%82%92%e3%82%a4%e3%83%b3%e3%83%a9%e3%82%a4%e3%83%b3%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%81%ab%e3%81%99%e3%82%8b>#</a></h3><p>テーブルをインラインテーブルにする際は <code>toml::table_format::oneline</code> を指定します。
通常のテーブルにする際は、 <code>toml::table_format::multiline</code> を指定します。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#a6e22e>oneline</span> = {<span style=color:#a6e22e>a</span> = <span style=color:#ae81ff>42</span>, <span style=color:#a6e22e>b</span> = <span style=color:#e6db74>&#34;foo&#34;</span>}
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>[<span style=color:#a6e22e>multiline</span>]
</span></span><span style=display:flex><span><span style=color:#a6e22e>a</span> = <span style=color:#ae81ff>42</span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>b</span> = <span style=color:#e6db74>&#34;foo&#34;</span>
</span></span></code></pre></div><p>TOML v1.1.0ではインラインテーブル内での改行が許可されますが、その場合は
<code>toml::table_format::multiline_oneline</code> とします。
これは、後述するTOMLバージョン指定で対応する機能フラグが<code>true</code>になっていない限り無視されます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#a6e22e>multiline_oneline</span> = {
</span></span><span style=display:flex><span> <span style=color:#a6e22e>a</span> = <span style=color:#ae81ff>42</span>,
</span></span><span style=display:flex><span> <span style=color:#a6e22e>b</span> = <span style=color:#e6db74>&#34;foo&#34;</span>
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>詳細は、<a href=https://toruniina.github.io/toml11/ja/docs/reference/format/#table_format>reference</a> を参照してください。</p><h2 id=toml言語バージョンを指定して出力する>TOML言語バージョンを指定して出力する
<a class=anchor href=#toml%e8%a8%80%e8%aa%9e%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%97%e3%81%a6%e5%87%ba%e5%8a%9b%e3%81%99%e3%82%8b>#</a></h2><p>TOML v1.1.0で許可されたインラインテーブル内の改行や<code>\x</code>エスケープシーケンスのように、
TOMLバージョンによって使用できない言語機能があります。</p><p><code>toml::format</code> は最後の引数に <code>toml::spec</code> を取ることができます。</p><p>これにより、シリアライズ時に使用するTOMLのバージョンを指定することができます。</p><p>特に、 <code>toml::parse</code><code>toml::spec</code> を使用して新機能を使用した場合は、
パースした値がそのバージョンでしか使えないフォーマット情報を持つ場合があるので、
<code>toml::format</code> にも同じ <code>toml::spec</code> を渡すことを忘れないようにしてください。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;iostream&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> spec <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>spec<span style=color:#f92672>::</span>v(<span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>0</span>)
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value v <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse(<span style=color:#e6db74>&#34;input.toml&#34;</span>, spec);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> toml<span style=color:#f92672>::</span>format(v, spec);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div></article><footer class=book-footer><div class="flex flex-wrap justify-between"></div><script>(function(){function e(e){const t=window.getSelection(),n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}document.querySelectorAll("pre code").forEach(t=>{t.addEventListener("click",function(){if(window.getSelection().toString())return;e(t.parentElement),navigator.clipboard&&navigator.clipboard.writeText(t.parentElement.textContent)})})})()</script></footer><label for=menu-control class="hidden book-menu-overlay"></label></div><aside class=book-toc><div class=book-toc-content><nav id=TableOfContents><ul><li><a href=#tomlファイルを出力する>TOMLファイルを出力する</a><ul><li><a href=#キーを渡して出力する>キーを渡して出力する</a></li><li><a href=#フォーマットを指定する>フォーマットを指定する</a><ul><li><a href=#整数のフォーマットを指定する>整数のフォーマットを指定する</a></li><li><a href=#配列を単一行複数行にする>配列を単一行・複数行にする</a></li><li><a href=#テーブルをインラインテーブルにする>テーブルをインラインテーブルにする</a></li></ul></li><li><a href=#toml言語バージョンを指定して出力する>TOML言語バージョンを指定して出力する</a></li></ul></li></ul></nav></div></aside></main></body></html>

View File

@@ -0,0 +1,133 @@
<!doctype html><html lang=ja dir=ltr><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content='
TOML言語バージョン
#
toml::spec
によって、 toml::parse や toml::format で使用するTOML言語のバージョンや、個別の機能フラグを指定することができます。
TOMLのバージョンを指定する
#
toml::spec
toml::semantic_version
から構築できます。
#include <toml.hpp>
int main()
{
toml::spec spec(toml::semantic_version(1, 1, 0));
return 0;
}
ですがこれは長いので、toml::spec::v()関数が用意されています。
#include <toml.hpp>
int main()
{
toml::spec spec = toml::spec::v(1, 1, 0);
return 0;
}
特に指定しない場合、デフォルトの値で構築する toml::spec::default_version() が使用されます。
デフォルトの値はtoml11のバージョンによって変わりますが、その時点でリリースされているTOML言語の最新バージョンに追従します。
v4.4.0現在、TOML v1.1.0はまだリリースされていないため、デフォルトのTOMLバージョンはv1.0.0です。
TOML v1.1.0の一部の機能にはかなり長い議論が続いており、まだ差し戻される可能性があります。
実際に差し戻された場合、toml11はマイナーバージョンアップでそれらの機能を削除、もしくは対応するそれ以降のバージョンに移動します。
そのような意味で、将来のバージョンに関する機能は全て不安定なものと考えてください。
バージョン指定でパースする
#
toml::parse
のオーバーロードは、ファイル名に続いてtoml::specを受け取ります。
これによって、使用するTOMLバージョンを変更できます。
#include <toml.hpp>
int main()
{
toml::value input = toml::parse("input.toml", toml::spec::v(1, 1, 0));
return 0;
}
バージョン指定でシリアライズする
#
toml::format
のオーバーロードは、 toml::value に続いて toml::spec を受け取ります。'><meta name=theme-color media="(prefers-color-scheme: light)" content="#ffffff"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#343a40"><meta name=color-scheme content="light dark"><meta property="og:url" content="https://toruniina.github.io/toml11/ja/docs/features/toml_spec/"><meta property="og:site_name" content="toml11"><meta property="og:title" content="toml spec"><meta property="og:description" content='TOML言語バージョン # toml::spec によって、 toml::parse や toml::format で使用するTOML言語のバージョンや、個別の機能フラグを指定することができます。
TOMLのバージョンを指定する # toml::spec は toml::semantic_version から構築できます。
#include <toml.hpp> int main() { toml::spec spec(toml::semantic_version(1, 1, 0)); return 0; } ですがこれは長いので、toml::spec::v()関数が用意されています。
#include <toml.hpp> int main() { toml::spec spec = toml::spec::v(1, 1, 0); return 0; } 特に指定しない場合、デフォルトの値で構築する toml::spec::default_version() が使用されます。
デフォルトの値はtoml11のバージョンによって変わりますが、その時点でリリースされているTOML言語の最新バージョンに追従します。
v4.4.0現在、TOML v1.1.0はまだリリースされていないため、デフォルトのTOMLバージョンはv1.0.0です。
TOML v1.1.0の一部の機能にはかなり長い議論が続いており、まだ差し戻される可能性があります。
実際に差し戻された場合、toml11はマイナーバージョンアップでそれらの機能を削除、もしくは対応するそれ以降のバージョンに移動します。
そのような意味で、将来のバージョンに関する機能は全て不安定なものと考えてください。
バージョン指定でパースする # toml::parse のオーバーロードは、ファイル名に続いてtoml::specを受け取ります。
これによって、使用するTOMLバージョンを変更できます。
#include <toml.hpp> int main() { toml::value input = toml::parse("input.toml", toml::spec::v(1, 1, 0)); return 0; } バージョン指定でシリアライズする # toml::format のオーバーロードは、 toml::value に続いて toml::spec を受け取ります。'><meta property="og:locale" content="ja"><meta property="og:type" content="article"><meta property="article:section" content="docs"><title>toml spec | toml11</title>
<link rel=manifest href=/toml11/manifest.json><link rel=icon href=/toml11/favicon.png><link rel=canonical href=https://toruniina.github.io/toml11/ja/docs/features/toml_spec/><link rel=alternate hreflang=en href=https://toruniina.github.io/toml11/docs/features/toml_spec/ title="toml spec"><link rel=stylesheet href=/toml11/book.min.ddac3efe7ea4c1007ff53e5a8fd67f12517e5d2e99984d8c67a18668f7ecaa03.css integrity="sha256-3aw+/n6kwQB/9T5aj9Z/ElF+XS6ZmE2MZ6GGaPfsqgM=" crossorigin=anonymous><script defer src=/toml11/fuse.min.js></script><script defer src=/toml11/ja.search.min.13aefbf6a803b591c02d5bc9a01dfe65fe37c31e2915c91573708d38e805d86c.js integrity="sha256-E6779qgDtZHALVvJoB3+Zf43wx4pFckVc3CNOOgF2Gw=" crossorigin=anonymous></script></head><body dir=ltr><input type=checkbox class="hidden toggle" id=menu-control>
<input type=checkbox class="hidden toggle" id=toc-control><main class="container flex"><aside class=book-menu><div class=book-menu-content><nav><h2 class=book-brand><a class="flex align-center" href=/toml11/ja/><span>toml11</span></a></h2><div class="book-search hidden"><input type=text id=book-search-input placeholder=検索 aria-label=検索 maxlength=64 data-hotkeys=s/><div class="book-search-spinner hidden"></div><ul id=book-search-results></ul></div><script>document.querySelector(".book-search").classList.remove("hidden")</script><ul class=book-languages><li><input type=checkbox id=languages class=toggle>
<label for=languages class="flex justify-between"><a role=button class="flex align-center"><img src=/toml11/svg/translate.svg class=book-icon alt=Languages>
日本語</a></label><ul><li><a href=https://toruniina.github.io/toml11/docs/features/toml_spec/>English</a></li></ul></li></ul><ul><li><a href=/toml11/ja/docs/installation/>installation</a><ul></ul></li><li><input type=checkbox id=section-b4cfb5b55e913a8d853eacf5e8fba05f class=toggle checked>
<label for=section-b4cfb5b55e913a8d853eacf5e8fba05f class="flex justify-between"><a href=/toml11/ja/docs/features/>features</a></label><ul><li><a href=/toml11/ja/docs/features/parsing_files/>parsing files</a></li><li><a href=/toml11/ja/docs/features/value/>getting values</a></li><li><a href=/toml11/ja/docs/features/error_message/>error message</a></li><li><a href=/toml11/ja/docs/features/serialize/>serializing values</a></li><li><a href=/toml11/ja/docs/features/configure_types/>configuring types</a></li><li><a href=/toml11/ja/docs/features/literal/>toml literal</a></li><li><a href=/toml11/ja/docs/features/toml_spec/ class=active>toml spec</a></li><li><a href=/toml11/ja/docs/features/extension/>extension</a></li></ul></li><li><input type=checkbox id=section-01b096afc5186aea96713b408b47c967 class=toggle>
<label for=section-01b096afc5186aea96713b408b47c967 class="flex justify-between"><a href=/toml11/ja/docs/reference/>reference</a></label><ul><li><a href=/toml11/ja/docs/reference/color/>color.hpp</a></li><li><a href=/toml11/ja/docs/reference/comments/>comments.hpp</a></li><li><a href=/toml11/ja/docs/reference/conversion/>conversion.hpp</a></li><li><a href=/toml11/ja/docs/reference/datetime/>datetime.hpp</a></li><li><a href=/toml11/ja/docs/reference/error_info/>error_info.hpp</a></li><li><a href=/toml11/ja/docs/reference/exception/>exception.hpp</a></li><li><a href=/toml11/ja/docs/reference/find/>find.hpp</a></li><li><a href=/toml11/ja/docs/reference/format/>format.hpp</a></li><li><a href=/toml11/ja/docs/reference/from/>from.hpp</a></li><li><a href=/toml11/ja/docs/reference/get/>get.hpp</a></li><li><a href=/toml11/ja/docs/reference/into/>into.hpp</a></li><li><a href=/toml11/ja/docs/reference/literal/>literal.hpp</a></li><li><a href=/toml11/ja/docs/reference/ordered_map/>ordered_map.hpp</a></li><li><a href=/toml11/ja/docs/reference/parser/>parser.hpp</a></li><li><a href=/toml11/ja/docs/reference/result/>result.hpp</a></li><li><a href=/toml11/ja/docs/reference/serializer/>serializer.hpp</a></li><li><a href=/toml11/ja/docs/reference/source_location/>source_location.hpp</a></li><li><a href=/toml11/ja/docs/reference/spec/>spec.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml_fwd/>toml_fwd.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml/>toml.hpp</a></li><li><a href=/toml11/ja/docs/reference/types/>types.hpp</a></li><li><a href=/toml11/ja/docs/reference/value_t/>value_t.hpp</a></li><li><a href=/toml11/ja/docs/reference/value/>value.hpp</a></li><li><a href=/toml11/ja/docs/reference/version/>version.hpp</a></li><li><a href=/toml11/ja/docs/reference/visit/>visit.hpp</a></li></ul></li><li><a href=/toml11/ja/docs/changelog/>changelog</a><ul></ul></li></ul><ul><li><a href=https://github.com/ToruNiina/toml11 target=_blank rel=noopener>GitHub</a></li></ul></nav><script>(function(){var e=document.querySelector("aside .book-menu-content");addEventListener("beforeunload",function(){localStorage.setItem("menu.scrollTop",e.scrollTop)}),e.scrollTop=localStorage.getItem("menu.scrollTop")})()</script></div></aside><div class=book-page><header class=book-header><div class="flex align-center justify-between"><label for=menu-control><img src=/toml11/svg/menu.svg class=book-icon alt=Menu>
</label><strong>toml spec</strong>
<label for=toc-control><img src=/toml11/svg/toc.svg class=book-icon alt="Table of Contents"></label></div><aside class="hidden clearfix"><nav id=TableOfContents><ul><li><a href=#toml言語バージョン>TOML言語バージョン</a><ul><li><a href=#tomlのバージョンを指定する>TOMLのバージョンを指定する</a><ul><li><a href=#バージョン指定でパースする>バージョン指定でパースする</a></li><li><a href=#バージョン指定でシリアライズする>バージョン指定でシリアライズする</a></li></ul></li><li><a href=#tomlに追加された新機能を個別に指定する>TOMLに追加された新機能を個別に指定する</a></li></ul></li></ul></nav></aside></header><article class="markdown book-article"><h1 id=toml言語バージョン>TOML言語バージョン
<a class=anchor href=#toml%e8%a8%80%e8%aa%9e%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3>#</a></h1><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/spec/#tomlspec><code>toml::spec</code></a>
によって、 <code>toml::parse</code><code>toml::format</code> で使用するTOML言語のバージョンや、個別の機能フラグを指定することができます。</p><h2 id=tomlのバージョンを指定する>TOMLのバージョンを指定する
<a class=anchor href=#toml%e3%81%ae%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b>#</a></h2><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/spec/#tomlspec><code>toml::spec</code></a>
<a href=https://toruniina.github.io/toml11/ja/docs/reference/spec/#tomlsemantic_version><code>toml::semantic_version</code></a>
から構築できます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> toml<span style=color:#f92672>::</span>spec spec(toml<span style=color:#f92672>::</span>semantic_version(<span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>0</span>));
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>ですがこれは長いので、<code>toml::spec::v()</code>関数が用意されています。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> toml<span style=color:#f92672>::</span>spec spec <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>spec<span style=color:#f92672>::</span>v(<span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>0</span>);
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>特に指定しない場合、デフォルトの値で構築する <code>toml::spec::default_version()</code> が使用されます。</p><p>デフォルトの値はtoml11のバージョンによって変わりますが、その時点でリリースされているTOML言語の最新バージョンに追従します。</p><p>v4.4.0現在、TOML v1.1.0はまだリリースされていないため、デフォルトのTOMLバージョンはv1.0.0です。</p><blockquote class="book-hint warning"><p>TOML v1.1.0の一部の機能にはかなり長い議論が続いており、まだ差し戻される可能性があります。</p><p>実際に差し戻された場合、toml11はマイナーバージョンアップでそれらの機能を削除、もしくは対応するそれ以降のバージョンに移動します。</p><p>そのような意味で、将来のバージョンに関する機能は全て不安定なものと考えてください。</p></blockquote><h3 id=バージョン指定でパースする>バージョン指定でパースする
<a class=anchor href=#%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e6%8c%87%e5%ae%9a%e3%81%a7%e3%83%91%e3%83%bc%e3%82%b9%e3%81%99%e3%82%8b>#</a></h3><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/parser/><code>toml::parse</code></a>
のオーバーロードは、ファイル名に続いて<code>toml::spec</code>を受け取ります。</p><p>これによって、使用するTOMLバージョンを変更できます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> toml<span style=color:#f92672>::</span>value input <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse(<span style=color:#e6db74>&#34;input.toml&#34;</span>, toml<span style=color:#f92672>::</span>spec<span style=color:#f92672>::</span>v(<span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>0</span>));
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=バージョン指定でシリアライズする>バージョン指定でシリアライズする
<a class=anchor href=#%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e6%8c%87%e5%ae%9a%e3%81%a7%e3%82%b7%e3%83%aa%e3%82%a2%e3%83%a9%e3%82%a4%e3%82%ba%e3%81%99%e3%82%8b>#</a></h3><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/serializer/><code>toml::format</code></a>
のオーバーロードは、 <code>toml::value</code> に続いて <code>toml::spec</code> を受け取ります。</p><p>これによって、使用するTOMLバージョンを変更できます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> toml<span style=color:#f92672>::</span>value v <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse(<span style=color:#e6db74>&#34;input.toml&#34;</span>, toml<span style=color:#f92672>::</span>spec<span style=color:#f92672>::</span>v(<span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>0</span>));
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> toml<span style=color:#f92672>::</span>format(v, toml<span style=color:#f92672>::</span>spec<span style=color:#f92672>::</span>v(<span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>0</span>)) <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>もしフォーマット変数などによって指定されているフォーマットが渡された <code>toml::spec</code>
では許可されていないものだった場合、指定は無視されて他のフォーマットにフォールバックされます。</p><h2 id=tomlに追加された新機能を個別に指定する>TOMLに追加された新機能を個別に指定する
<a class=anchor href=#toml%e3%81%ab%e8%bf%bd%e5%8a%a0%e3%81%95%e3%82%8c%e3%81%9f%e6%96%b0%e6%a9%9f%e8%83%bd%e3%82%92%e5%80%8b%e5%88%a5%e3%81%ab%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b>#</a></h2><p>TOMLのバージョンアップで追加された機能は複数あり、そのうちの一部だけを有効にすることが可能です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>()
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> toml<span style=color:#f92672>::</span>spec spec <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>spec<span style=color:#f92672>::</span>v(<span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>0</span>, <span style=color:#ae81ff>0</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#75715e>// インラインテーブル内での改行を許可
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> spec.v1_1_0_allow_newlines_in_inline_tables <span style=color:#f92672>=</span> true;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> toml<span style=color:#f92672>::</span>value input <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse(<span style=color:#e6db74>&#34;input.toml&#34;</span>, spec);
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>全てのフラグのリストは、
<a href=https://toruniina.github.io/toml11/ja/docs/reference/spec/#tomlspec><code>toml::spec</code></a>
を参照してください。</p></article><footer class=book-footer><div class="flex flex-wrap justify-between"></div><script>(function(){function e(e){const t=window.getSelection(),n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}document.querySelectorAll("pre code").forEach(t=>{t.addEventListener("click",function(){if(window.getSelection().toString())return;e(t.parentElement),navigator.clipboard&&navigator.clipboard.writeText(t.parentElement.textContent)})})})()</script></footer><label for=menu-control class="hidden book-menu-overlay"></label></div><aside class=book-toc><div class=book-toc-content><nav id=TableOfContents><ul><li><a href=#toml言語バージョン>TOML言語バージョン</a><ul><li><a href=#tomlのバージョンを指定する>TOMLのバージョンを指定する</a><ul><li><a href=#バージョン指定でパースする>バージョン指定でパースする</a></li><li><a href=#バージョン指定でシリアライズする>バージョン指定でシリアライズする</a></li></ul></li><li><a href=#tomlに追加された新機能を個別に指定する>TOMLに追加された新機能を個別に指定する</a></li></ul></li></ul></nav></div></aside></main></body></html>

View File

@@ -0,0 +1,484 @@
<!doctype html><html lang=ja dir=ltr><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="
値を取り出す
#
ここでは、 toml::value が格納している値にアクセスする方法を説明します。
メンバ関数を使って値にアクセスする
#
is_something と as_something
#
toml::value は is_boolean() や is_integer() などのメンバ関数を持っており、
これらを使うと持っている型を調べることができます。
また、 as_boolean(), as_integer() などのメンバ関数も持っており、
これらを使ってその型にアクセスすることができます。
完全なリストは toml::value のリファレンス を参照してください。
toml::value v = /* ... */;
if(v.is_integer())
{
std::cout << v.as_integer() << std::endl;
}
指定された値と異なる型が格納されていた場合、 toml::type_error が送出されます。
その what() は以下のようなメッセージを含みます。
[error] toml::value::as_string(): bad_cast to string
--> input.toml
|
1 | a = 123_456
| ^^^^^^^-- the actual type is integer
toml::value_t
#
型情報は enum class toml::value_t で識別できます。"><meta name=theme-color media="(prefers-color-scheme: light)" content="#ffffff"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#343a40"><meta name=color-scheme content="light dark"><meta property="og:url" content="https://toruniina.github.io/toml11/ja/docs/features/value/"><meta property="og:site_name" content="toml11"><meta property="og:title" content="getting values"><meta property="og:description" content="値を取り出す # ここでは、 toml::value が格納している値にアクセスする方法を説明します。
メンバ関数を使って値にアクセスする # is_something と as_something # toml::value は is_boolean() や is_integer() などのメンバ関数を持っており、 これらを使うと持っている型を調べることができます。
また、 as_boolean(), as_integer() などのメンバ関数も持っており、 これらを使ってその型にアクセスすることができます。
完全なリストは toml::value のリファレンス を参照してください。
toml::value v = /* ... */; if(v.is_integer()) { std::cout << v.as_integer() << std::endl; } 指定された値と異なる型が格納されていた場合、 toml::type_error が送出されます。
その what() は以下のようなメッセージを含みます。
[error] toml::value::as_string(): bad_cast to string --> input.toml | 1 | a = 123_456 | ^^^^^^^-- the actual type is integer toml::value_t # 型情報は enum class toml::value_t で識別できます。"><meta property="og:locale" content="ja"><meta property="og:type" content="article"><meta property="article:section" content="docs"><title>getting values | toml11</title>
<link rel=manifest href=/toml11/manifest.json><link rel=icon href=/toml11/favicon.png><link rel=canonical href=https://toruniina.github.io/toml11/ja/docs/features/value/><link rel=alternate hreflang=en href=https://toruniina.github.io/toml11/docs/features/value/ title="getting values"><link rel=stylesheet href=/toml11/book.min.ddac3efe7ea4c1007ff53e5a8fd67f12517e5d2e99984d8c67a18668f7ecaa03.css integrity="sha256-3aw+/n6kwQB/9T5aj9Z/ElF+XS6ZmE2MZ6GGaPfsqgM=" crossorigin=anonymous><script defer src=/toml11/fuse.min.js></script><script defer src=/toml11/ja.search.min.13aefbf6a803b591c02d5bc9a01dfe65fe37c31e2915c91573708d38e805d86c.js integrity="sha256-E6779qgDtZHALVvJoB3+Zf43wx4pFckVc3CNOOgF2Gw=" crossorigin=anonymous></script></head><body dir=ltr><input type=checkbox class="hidden toggle" id=menu-control>
<input type=checkbox class="hidden toggle" id=toc-control><main class="container flex"><aside class=book-menu><div class=book-menu-content><nav><h2 class=book-brand><a class="flex align-center" href=/toml11/ja/><span>toml11</span></a></h2><div class="book-search hidden"><input type=text id=book-search-input placeholder=検索 aria-label=検索 maxlength=64 data-hotkeys=s/><div class="book-search-spinner hidden"></div><ul id=book-search-results></ul></div><script>document.querySelector(".book-search").classList.remove("hidden")</script><ul class=book-languages><li><input type=checkbox id=languages class=toggle>
<label for=languages class="flex justify-between"><a role=button class="flex align-center"><img src=/toml11/svg/translate.svg class=book-icon alt=Languages>
日本語</a></label><ul><li><a href=https://toruniina.github.io/toml11/docs/features/value/>English</a></li></ul></li></ul><ul><li><a href=/toml11/ja/docs/installation/>installation</a><ul></ul></li><li><input type=checkbox id=section-b4cfb5b55e913a8d853eacf5e8fba05f class=toggle checked>
<label for=section-b4cfb5b55e913a8d853eacf5e8fba05f class="flex justify-between"><a href=/toml11/ja/docs/features/>features</a></label><ul><li><a href=/toml11/ja/docs/features/parsing_files/>parsing files</a></li><li><a href=/toml11/ja/docs/features/value/ class=active>getting values</a></li><li><a href=/toml11/ja/docs/features/error_message/>error message</a></li><li><a href=/toml11/ja/docs/features/serialize/>serializing values</a></li><li><a href=/toml11/ja/docs/features/configure_types/>configuring types</a></li><li><a href=/toml11/ja/docs/features/literal/>toml literal</a></li><li><a href=/toml11/ja/docs/features/toml_spec/>toml spec</a></li><li><a href=/toml11/ja/docs/features/extension/>extension</a></li></ul></li><li><input type=checkbox id=section-01b096afc5186aea96713b408b47c967 class=toggle>
<label for=section-01b096afc5186aea96713b408b47c967 class="flex justify-between"><a href=/toml11/ja/docs/reference/>reference</a></label><ul><li><a href=/toml11/ja/docs/reference/color/>color.hpp</a></li><li><a href=/toml11/ja/docs/reference/comments/>comments.hpp</a></li><li><a href=/toml11/ja/docs/reference/conversion/>conversion.hpp</a></li><li><a href=/toml11/ja/docs/reference/datetime/>datetime.hpp</a></li><li><a href=/toml11/ja/docs/reference/error_info/>error_info.hpp</a></li><li><a href=/toml11/ja/docs/reference/exception/>exception.hpp</a></li><li><a href=/toml11/ja/docs/reference/find/>find.hpp</a></li><li><a href=/toml11/ja/docs/reference/format/>format.hpp</a></li><li><a href=/toml11/ja/docs/reference/from/>from.hpp</a></li><li><a href=/toml11/ja/docs/reference/get/>get.hpp</a></li><li><a href=/toml11/ja/docs/reference/into/>into.hpp</a></li><li><a href=/toml11/ja/docs/reference/literal/>literal.hpp</a></li><li><a href=/toml11/ja/docs/reference/ordered_map/>ordered_map.hpp</a></li><li><a href=/toml11/ja/docs/reference/parser/>parser.hpp</a></li><li><a href=/toml11/ja/docs/reference/result/>result.hpp</a></li><li><a href=/toml11/ja/docs/reference/serializer/>serializer.hpp</a></li><li><a href=/toml11/ja/docs/reference/source_location/>source_location.hpp</a></li><li><a href=/toml11/ja/docs/reference/spec/>spec.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml_fwd/>toml_fwd.hpp</a></li><li><a href=/toml11/ja/docs/reference/toml/>toml.hpp</a></li><li><a href=/toml11/ja/docs/reference/types/>types.hpp</a></li><li><a href=/toml11/ja/docs/reference/value_t/>value_t.hpp</a></li><li><a href=/toml11/ja/docs/reference/value/>value.hpp</a></li><li><a href=/toml11/ja/docs/reference/version/>version.hpp</a></li><li><a href=/toml11/ja/docs/reference/visit/>visit.hpp</a></li></ul></li><li><a href=/toml11/ja/docs/changelog/>changelog</a><ul></ul></li></ul><ul><li><a href=https://github.com/ToruNiina/toml11 target=_blank rel=noopener>GitHub</a></li></ul></nav><script>(function(){var e=document.querySelector("aside .book-menu-content");addEventListener("beforeunload",function(){localStorage.setItem("menu.scrollTop",e.scrollTop)}),e.scrollTop=localStorage.getItem("menu.scrollTop")})()</script></div></aside><div class=book-page><header class=book-header><div class="flex align-center justify-between"><label for=menu-control><img src=/toml11/svg/menu.svg class=book-icon alt=Menu>
</label><strong>getting values</strong>
<label for=toc-control><img src=/toml11/svg/toc.svg class=book-icon alt="Table of Contents"></label></div><aside class="hidden clearfix"><nav id=TableOfContents><ul><li><a href=#値を取り出す>値を取り出す</a><ul><li><a href=#メンバ関数を使って値にアクセスする>メンバ関数を使って値にアクセスする</a><ul><li><a href=#is_something-と-as_something><code>is_something</code><code>as_something</code></a></li><li><a href=#tomlvalue_t><code>toml::value_t</code></a></li><li><a href=#at--contains-size-push_back-emplace_back><code>at</code>, <code>[]</code>, <code>contains</code>, <code>size</code>, <code>push_back</code>, <code>emplace_back</code></a></li></ul></li><li><a href=#コメントにアクセスする>コメントにアクセスする</a></li><li><a href=#インラインテーブルドットキーの取り扱い>インラインテーブル・ドットキーの取り扱い</a></li><li><a href=#日付情報の取り扱い>日付情報の取り扱い</a></li><li><a href=#tomlgettを使って変換する><code>toml::get&lt;T></code>を使って変換する</a><ul><li><a href=#単純な変換>単純な変換</a></li><li><a href=#参照を取得できる条件>参照を取得できる条件</a></li><li><a href=#配列をstlコンテナに>配列をSTLコンテナに</a></li><li><a href=#配列を-stdpair-stdtuple-に>配列を <code>std::pair</code>, <code>std::tuple</code></a></li><li><a href=#ネストされた配列の変換>ネストされた配列の変換</a></li><li><a href=#テーブルを-stdmap-に変換>テーブルを <code>std::map</code> に変換</a></li></ul></li><li><a href=#tomlget_orを使って失敗時の値を指定する><code>toml::get_or</code>を使って失敗時の値を指定する</a></li><li><a href=#tomlfindtを使って検索と変換を同時に行う><code>toml::find&lt;T></code>を使って検索と変換を同時に行う</a></li><li><a href=#tomlfind_orを使って失敗時の値を指定する><code>toml::find_or</code>を使って失敗時の値を指定する</a></li><li><a href=#tomlfind_or_defaultを使って失敗時の値を指定する><code>toml::find_or_default</code>を使って失敗時の値を指定する</a></li><li><a href=#tomlfindstdoptionalt><code>toml::find&lt;std::optional&lt;T>></code></a></li><li><a href=#ユーザー定義型との変換を定義する>ユーザー定義型との変換を定義する</a><ul><li><a href=#tomlfrom-の定義><code>toml::from</code> の定義</a></li><li><a href=#from_toml-メンバ関数の定義><code>from_toml</code> メンバ関数の定義</a></li><li><a href=#tomlvalue-を受け取るコンストラクタ><code>toml::value</code> を受け取るコンストラクタ</a></li></ul></li><li><a href=#tomlvisitで関数を適用する><code>toml::visit</code>で関数を適用する</a></li><li><a href=#tomlvalue-を構築する><code>toml::value</code> を構築する</a></li><li><a href=#tomlvalue-に変換する><code>toml::value</code> に変換する</a><ul><li><a href=#tomlintoを定義する><code>toml::into</code>を定義する</a></li><li><a href=#into_toml-メンバ関数を定義する><code>into_toml</code> メンバ関数を定義する</a></li></ul></li></ul></li><li><a href=#値がアクセス済みかどうかチェックする>値がアクセス済みかどうかチェックする</a></li></ul></nav></aside></header><article class="markdown book-article"><h1 id=値を取り出す>値を取り出す
<a class=anchor href=#%e5%80%a4%e3%82%92%e5%8f%96%e3%82%8a%e5%87%ba%e3%81%99>#</a></h1><p>ここでは、 <code>toml::value</code> が格納している値にアクセスする方法を説明します。</p><h2 id=メンバ関数を使って値にアクセスする>メンバ関数を使って値にアクセスする
<a class=anchor href=#%e3%83%a1%e3%83%b3%e3%83%90%e9%96%a2%e6%95%b0%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e5%80%a4%e3%81%ab%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%81%99%e3%82%8b>#</a></h2><h3 id=is_something-と-as_something><code>is_something</code><code>as_something</code>
<a class=anchor href=#is_something-%e3%81%a8-as_something>#</a></h3><p><code>toml::value</code><code>is_boolean()</code><code>is_integer()</code> などのメンバ関数を持っており、
これらを使うと持っている型を調べることができます。</p><p>また、 <code>as_boolean()</code>, <code>as_integer()</code> などのメンバ関数も持っており、
これらを使ってその型にアクセスすることができます。</p><p>完全なリストは <a href=https://toruniina.github.io/toml11/ja/docs/reference/value/#is_xxx><code>toml::value</code> のリファレンス</a> を参照してください。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v <span style=color:#f92672>=</span> <span style=color:#75715e>/* ... */</span>;
</span></span><span style=display:flex><span><span style=color:#66d9ef>if</span>(v.is_integer())
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> v.as_integer() <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>指定された値と異なる型が格納されていた場合、 <a href=https://toruniina.github.io/toml11/ja/docs/reference/value/#tomltype_error><code>toml::type_error</code></a> が送出されます。</p><p>その <code>what()</code> は以下のようなメッセージを含みます。</p><pre tabindex=0><code>[error] toml::value::as_string(): bad_cast to string
--&gt; input.toml
|
1 | a = 123_456
| ^^^^^^^-- the actual type is integer
</code></pre><h3 id=tomlvalue_t><code>toml::value_t</code>
<a class=anchor href=#tomlvalue_t>#</a></h3><p>型情報は <a href=https://toruniina.github.io/toml11/ja/docs/reference/value_t/><code>enum class toml::value_t</code></a> で識別できます。</p><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/value/#type><code>type()</code></a> メンバ関数は、現時点で格納している値の型情報を返します。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v <span style=color:#f92672>=</span> <span style=color:#75715e>/* ... */</span>;
</span></span><span style=display:flex><span><span style=color:#66d9ef>switch</span>(v.type())
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>case</span> toml:value_t<span style=color:#f92672>::</span>empty : { <span style=color:#75715e>/*...*/</span> <span style=color:#66d9ef>break</span>; }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>case</span> toml:value_t<span style=color:#f92672>::</span>boolean : { <span style=color:#75715e>/*...*/</span> <span style=color:#66d9ef>break</span>; }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>case</span> toml:value_t<span style=color:#f92672>::</span>integer : { <span style=color:#75715e>/*...*/</span> <span style=color:#66d9ef>break</span>; }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>case</span> toml:value_t<span style=color:#f92672>::</span>floating : { <span style=color:#75715e>/*...*/</span> <span style=color:#66d9ef>break</span>; }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>case</span> toml:value_t<span style=color:#f92672>::</span>string : { <span style=color:#75715e>/*...*/</span> <span style=color:#66d9ef>break</span>; }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>case</span> toml:value_t<span style=color:#f92672>::</span>offset_datetime: { <span style=color:#75715e>/*...*/</span> <span style=color:#66d9ef>break</span>; }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>case</span> toml:value_t<span style=color:#f92672>::</span>local_datetime : { <span style=color:#75715e>/*...*/</span> <span style=color:#66d9ef>break</span>; }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>case</span> toml:value_t<span style=color:#f92672>::</span>local_date : { <span style=color:#75715e>/*...*/</span> <span style=color:#66d9ef>break</span>; }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>case</span> toml:value_t<span style=color:#f92672>::</span>local_time : { <span style=color:#75715e>/*...*/</span> <span style=color:#66d9ef>break</span>; }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>case</span> toml:value_t<span style=color:#f92672>::</span>array : { <span style=color:#75715e>/*...*/</span> <span style=color:#66d9ef>break</span>; }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>case</span> toml:value_t<span style=color:#f92672>::</span>table : { <span style=color:#75715e>/*...*/</span> <span style=color:#66d9ef>break</span>; }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>default</span><span style=color:#f92672>:</span> {<span style=color:#66d9ef>break</span>;}
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/value/#istomlvalue_t><code>is(toml::value_t)</code></a> メンバ関数は、渡された <code>value_t</code> と同じ型の値を格納している場合 <code>true</code> を、
それ以外の場合 <code>false</code> を返します。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v <span style=color:#f92672>=</span> <span style=color:#75715e>/* ... */</span>;
</span></span><span style=display:flex><span><span style=color:#66d9ef>if</span>(v.is(toml<span style=color:#f92672>::</span>value_t<span style=color:#f92672>::</span>integer))
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> v.as_integer() <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><h3 id=at--contains-size-push_back-emplace_back><code>at</code>, <code>[]</code>, <code>contains</code>, <code>size</code>, <code>push_back</code>, <code>emplace_back</code>
<a class=anchor href=#at--contains-size-push_back-emplace_back>#</a></h3><p>標準ライブラリコンテナが持つメンバ関数の一部は、 <code>toml::value</code> も提供しています。</p><p>これらは、内部で <code>toml::value</code> を対応する型に変換し、そのメンバ関数を呼び出します。</p><h4 id=atstdsize_t-i-operatorstdsize_t-i><code>at(std::size_t i)</code>, <code>operator[](std::size_t i)</code>
<a class=anchor href=#atstdsize_t-i-operatorstdsize_t-i>#</a></h4><p><code>as_array().at(i)</code>, <code>as_array()[i]</code> と同等です。</p><p><code>toml::value</code> はデフォルトで <code>std::vector&lt;toml::value></code><code>array_type</code> に使うので、
エラーが発生した際には <code>at</code><code>std::out_of_range</code> を送出し、<code>operator[]</code> は未定義動作となります。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v(toml<span style=color:#f92672>::</span>array{<span style=color:#ae81ff>1</span>,<span style=color:#ae81ff>2</span>,<span style=color:#ae81ff>3</span>});
</span></span><span style=display:flex><span>std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> v.at(<span style=color:#ae81ff>1</span>);
</span></span></code></pre></div><p>格納している型が <code>array_type</code> ではなかった場合、 <code>type_error</code> を送出します。</p><h4 id=atstdstring-key-operatorstdstring-key><code>at(std::string key)</code>, <code>operator[](std::string key)</code>
<a class=anchor href=#atstdstring-key-operatorstdstring-key>#</a></h4><p><code>as_table().at(key)</code>, <code>as_table()[key]</code> と同等です。</p><p><code>toml::value</code> はデフォルトで <code>std::unordered_map&lt;std::string, toml::value></code><code>table_type</code> に使うので、
対応する値が存在しない場合は <code>at</code><code>std::out_of_range</code> を送出し、 <code>operator[]</code> は新しく <code>toml::value</code> を構築してそれへの参照を返します。
そのため、<code>operator[]</code><code>const</code> 版はありません。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v(toml<span style=color:#f92672>::</span>table{});
</span></span><span style=display:flex><span>v[<span style=color:#e6db74>&#34;a&#34;</span>] <span style=color:#f92672>=</span> <span style=color:#ae81ff>42</span>;
</span></span></code></pre></div><p>格納している型が <code>table_type</code> ではなかった場合、 <code>type_error</code> を送出します。</p><h4 id=size><code>size()</code>
<a class=anchor href=#size>#</a></h4><p>長さを返します。</p><p><code>array_type</code> または <code>table_type</code> の場合は要素数、 <code>string_type</code> の場合は文字数を返します。</p><p>格納している型がどれでもなかった場合、 <code>type_error</code> を送出します。</p><h4 id=push_back-emplace_back><code>push_back()</code>, <code>emplace_back()</code>
<a class=anchor href=#push_back-emplace_back>#</a></h4><p><code>as_array().push_back()</code>, <code>as_array().emplace_back()</code> と同一です。</p><p>格納している型が <code>array_type</code> ではなかった場合、 <code>type_error</code> を送出します。</p><h2 id=コメントにアクセスする>コメントにアクセスする
<a class=anchor href=#%e3%82%b3%e3%83%a1%e3%83%b3%e3%83%88%e3%81%ab%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%81%99%e3%82%8b>#</a></h2><p>toml11では、デフォルトでコメントがパースされ、対応する値に行ごとに保存されます。</p><p>対応する値は、連続するコメント行の直後に来る値か、もしくはそのコメントと同じ行に描かれている値です。</p><p>直前または直後に値がなければ、そのコメントはどこにも紐づけられず、無視されます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#75715e># input.toml</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#75715e># これはaに関するコメントです。</span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>a</span> = <span style=color:#ae81ff>42</span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>b</span> = <span style=color:#ae81ff>3.14</span> <span style=color:#75715e># これはbに関するコメントです。</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#75715e># このコメントには対応する値がないため無視されます。</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#75715e># これは1番目のcに関するコメントです。</span>
</span></span><span style=display:flex><span><span style=color:#75715e># これは2番目のcに関するコメントです。</span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>c</span> = <span style=color:#e6db74>&#34;foo&#34;</span> <span style=color:#75715e># これは最後のcに関するコメントです。</span>
</span></span></code></pre></div><p>値に対応するコメントには、<code>toml::value</code><code>comments()</code> メンバ関数を使ってアクセスします。</p><p><code>comments()</code><code>std::vector&lt;std::string></code> と同じメンバ関数を持つコンテナを返します。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> v <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse(<span style=color:#e6db74>&#34;input.toml&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span><span style=color:#f92672>&amp;</span> a <span style=color:#f92672>=</span> v.at(<span style=color:#e6db74>&#34;a&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span><span style=color:#f92672>&amp;</span> b <span style=color:#f92672>=</span> v.at(<span style=color:#e6db74>&#34;b&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span><span style=color:#f92672>&amp;</span> c <span style=color:#f92672>=</span> v.at(<span style=color:#e6db74>&#34;c&#34;</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>assert(a.comments().size() <span style=color:#f92672>==</span> <span style=color:#ae81ff>1</span>);
</span></span><span style=display:flex><span>assert(a.comments().at(<span style=color:#ae81ff>0</span>) <span style=color:#f92672>==</span> <span style=color:#e6db74>&#34;# これはaに関するコメントです。&#34;</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>assert(b.comments().size() <span style=color:#f92672>==</span> <span style=color:#ae81ff>1</span>);
</span></span><span style=display:flex><span>assert(b.comments().at(<span style=color:#ae81ff>0</span>) <span style=color:#f92672>==</span> <span style=color:#e6db74>&#34;# これはbに関するコメントです。&#34;</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>assert(c.comments().size() <span style=color:#f92672>==</span> <span style=color:#ae81ff>3</span>);
</span></span><span style=display:flex><span>assert(c.comments().at(<span style=color:#ae81ff>0</span>) <span style=color:#f92672>==</span> <span style=color:#e6db74>&#34;# これは1番目のcに関するコメントです。&#34;</span>);
</span></span><span style=display:flex><span>assert(c.comments().at(<span style=color:#ae81ff>1</span>) <span style=color:#f92672>==</span> <span style=color:#e6db74>&#34;# これは2番目のcに関するコメントです。&#34;</span>);
</span></span><span style=display:flex><span>assert(c.comments().at(<span style=color:#ae81ff>2</span>) <span style=color:#f92672>==</span> <span style=color:#e6db74>&#34;# これは最後のcに関するコメントです。&#34;</span>);
</span></span></code></pre></div><p>ファイル全体に対応するルートテーブルに関するコメントは、ファイルの先頭に書きます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#75715e># ルートテーブルに関するコメントです。</span>
</span></span><span style=display:flex><span><span style=color:#75715e># これもルートテーブルに関するコメントです。</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#75715e># これはaに関するコメントです。</span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>a</span> = <span style=color:#ae81ff>42</span>
</span></span></code></pre></div><p>ただし、もしファイルの先頭のコメントの直後に値が来た場合、
そのコメントはその値に関するコメントと解釈され、ルートテーブルのコメントはなくなります。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#75715e># これはaに関するコメントです。</span>
</span></span><span style=display:flex><span><span style=color:#75715e># これもaに関するコメントです。</span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>a</span> = <span style=color:#ae81ff>42</span>
</span></span></code></pre></div><h2 id=インラインテーブルドットキーの取り扱い>インラインテーブル・ドットキーの取り扱い
<a class=anchor href=#%e3%82%a4%e3%83%b3%e3%83%a9%e3%82%a4%e3%83%b3%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%83%89%e3%83%83%e3%83%88%e3%82%ad%e3%83%bc%e3%81%ae%e5%8f%96%e3%82%8a%e6%89%b1%e3%81%84>#</a></h2><p>インラインテーブルは単にテーブルで、C++コード上で他のテーブルと異なる点はありません。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#a6e22e>a</span> = {<span style=color:#a6e22e>b</span> = <span style=color:#ae81ff>42</span>, <span style=color:#a6e22e>c</span> = <span style=color:#e6db74>&#34;foo&#34;</span>}
</span></span></code></pre></div><p>ドットキーも単にテーブルで、C++コード上で他のテーブルと異なる点はありません。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#a6e22e>a</span>.<span style=color:#a6e22e>b</span> = <span style=color:#ae81ff>42</span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>a</span>.<span style=color:#a6e22e>c</span> = <span style=color:#e6db74>&#34;foo&#34;</span>
</span></span></code></pre></div><p>これらは以下のファイルと全く同じ構造を持ちます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span>[<span style=color:#a6e22e>a</span>]
</span></span><span style=display:flex><span><span style=color:#a6e22e>b</span> = <span style=color:#ae81ff>42</span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>c</span> = <span style=color:#e6db74>&#34;foo&#34;</span>
</span></span></code></pre></div><p>なので、どの記法でも以下の全く同一のコードで処理できます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> input <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse(<span style=color:#e6db74>&#34;input.toml&#34;</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>assert(input.at(<span style=color:#e6db74>&#34;a&#34;</span>).at(<span style=color:#e6db74>&#34;b&#34;</span>).as_integer() <span style=color:#f92672>==</span> <span style=color:#ae81ff>42</span>);
</span></span><span style=display:flex><span>assert(input.at(<span style=color:#e6db74>&#34;a&#34;</span>).at(<span style=color:#e6db74>&#34;c&#34;</span>).as_string() <span style=color:#f92672>==</span> <span style=color:#e6db74>&#34;foo&#34;</span>);
</span></span></code></pre></div><p>ただし、フォーマット情報によって区別することは可能です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> input <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse(<span style=color:#e6db74>&#34;input.toml&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#66d9ef>switch</span>(input.at(<span style=color:#e6db74>&#34;a&#34;</span>).as_table_fmt().fmt)
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>case</span> toml<span style=color:#f92672>::</span>table_format<span style=color:#f92672>::</span>oneline:
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> <span style=color:#e6db74>&#34;inline table&#34;</span> <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>break</span>;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>case</span> toml<span style=color:#f92672>::</span>table_format<span style=color:#f92672>::</span>multiline:
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> <span style=color:#e6db74>&#34;normal table&#34;</span> <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>break</span>;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>case</span> toml<span style=color:#f92672>::</span>table_format<span style=color:#f92672>::</span>dotted:
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> <span style=color:#e6db74>&#34;dotted keys&#34;</span> <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>break</span>;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>このフォーマット情報は後述するシリアライズの際も考慮されます。</p><h2 id=日付情報の取り扱い>日付情報の取り扱い
<a class=anchor href=#%e6%97%a5%e4%bb%98%e6%83%85%e5%a0%b1%e3%81%ae%e5%8f%96%e3%82%8a%e6%89%b1%e3%81%84>#</a></h2><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/datetime/#local_date><code>local_date</code></a>,
<a href=https://toruniina.github.io/toml11/ja/docs/reference/datetime/#local_time><code>local_time</code></a>,
<a href=https://toruniina.github.io/toml11/ja/docs/reference/datetime/#local_datetime><code>local_datetime</code></a>, そして
<a href=https://toruniina.github.io/toml11/ja/docs/reference/datetime/#offset_datetime><code>offset_datetime</code></a> は、
toml11では対応するメンバ変数を持つ専用の構造体にパースされます。</p><p>使用する際は、直接値を取り出す他にも、後述する <code>toml::get</code><code>toml::find</code> を使用して、
<code>std::chrono::system_clock::time_point</code><code>std::tm</code> 等の型に変換することができます。</p><h2 id=tomlgettを使って変換する><code>toml::get&lt;T></code>を使って変換する
<a class=anchor href=#tomlgett%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e5%a4%89%e6%8f%9b%e3%81%99%e3%82%8b>#</a></h2><p><code>toml::get&lt;T></code> は、 <code>toml::value</code> の持つ値を変換して取り出す関数です。
<code>T</code> に変換先に指定したい型を指定します。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value v <span style=color:#f92672>=</span> <span style=color:#75715e>/*...*/</span>;
</span></span><span style=display:flex><span>std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;</span>(v) <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl;
</span></span></code></pre></div><p>後述する <code>toml::find&lt;T></code> も、型変換の部分は同一の機能を持ちます。</p><p>格納されている型のそれぞれについて、
変換ができない型が指定された場合、 <code>toml::type_error</code> が送出されます。</p><h3 id=単純な変換>単純な変換
<a class=anchor href=#%e5%8d%98%e7%b4%94%e3%81%aa%e5%a4%89%e6%8f%9b>#</a></h3><h4 id=boolean_type>boolean_type
<a class=anchor href=#boolean_type>#</a></h4><p><code>boolean_type</code> から変換が可能なのは、 <code>bool</code> のみです。</p><h4 id=integer_type>integer_type
<a class=anchor href=#integer_type>#</a></h4><p><code>bool</code> 以外で <code>std::is_integral&lt;T></code><code>true</code> になる型は、 <code>integer_type</code> から変換できます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v(<span style=color:#ae81ff>42</span>);
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> u32 <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span><span style=color:#66d9ef>uint32_t</span><span style=color:#f92672>&gt;</span>(v);
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> i16 <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>short</span><span style=color:#f92672>&gt;</span>(v);
</span></span></code></pre></div><h4 id=floating_type>floating_type
<a class=anchor href=#floating_type>#</a></h4><p><code>std::is_floating_point&lt;T></code><code>true</code> になる型は、<code>floating_type</code> から変換できます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v(<span style=color:#ae81ff>3.14</span>);
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> f64 <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>double</span><span style=color:#f92672>&gt;</span>(v);
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> f32 <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>float</span> <span style=color:#f92672>&gt;</span>(v);
</span></span></code></pre></div><h4 id=string_type>string_type
<a class=anchor href=#string_type>#</a></h4><p><code>string_type</code> からは <code>std::string</code> へ変換できます。
また、C++17以降では、<code>std::string_view</code> へも変換できます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v(<span style=color:#e6db74>&#34;foo&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> s <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>string<span style=color:#f92672>&gt;</span>(v);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#75715e>// C++17以降
</span></span></span><span style=display:flex><span><span style=color:#75715e></span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> sv <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>string_view<span style=color:#f92672>&gt;</span>(v);
</span></span></code></pre></div><h4 id=datetime-variants>datetime variants
<a class=anchor href=#datetime-variants>#</a></h4><p><a href=https://toruniina.github.io/toml11/ja/docs/reference/datetime/#local_date><code>local_date</code></a>,
<a href=https://toruniina.github.io/toml11/ja/docs/reference/datetime/#local_datetime><code>local_datetime</code></a>,
<a href=https://toruniina.github.io/toml11/ja/docs/reference/datetime/#offset_datetime><code>offset_datetime</code></a>
ある日付と時刻を指しているため、
<code>std::chrono::system_clock::time_point</code> への変換が可能です。</p><p>ただし、<a href=https://toruniina.github.io/toml11/ja/docs/reference/datetime/#local_time><code>local_time</code></a>
日付の情報がないため、0時0分からの経過時刻として <code>std::chrono::duration</code> への
変換をサポートします。</p><p>また、 <code>local_date</code><code>local_datetime</code> は実行中のマシンのタイムゾーンを取得して変換を行います。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#a6e22e>date</span> = <span style=color:#ae81ff>2024-01-23</span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>time</span> = <span style=color:#ae81ff>12</span><span style=color:#960050;background-color:#1e0010>:</span><span style=color:#ae81ff>30</span><span style=color:#960050;background-color:#1e0010>:</span><span style=color:#ae81ff>00</span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>l_dt</span> = <span style=color:#ae81ff>2024-01-23</span><span style=color:#a6e22e>T12</span><span style=color:#960050;background-color:#1e0010>:</span><span style=color:#ae81ff>30</span><span style=color:#960050;background-color:#1e0010>:</span><span style=color:#ae81ff>00</span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>o_dt</span> = <span style=color:#e6db74>2024-01-23T12:30:00+09:00</span>
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> input <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse(<span style=color:#e6db74>&#34;input.toml&#34;</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> date <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>chrono<span style=color:#f92672>::</span>system_clock<span style=color:#f92672>::</span>time_point<span style=color:#f92672>&gt;</span>(input.at(<span style=color:#e6db74>&#34;date&#34;</span>));
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> l_dt <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>chrono<span style=color:#f92672>::</span>system_clock<span style=color:#f92672>::</span>time_point<span style=color:#f92672>&gt;</span>(input.at(<span style=color:#e6db74>&#34;l_dt&#34;</span>));
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> o_dt <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>chrono<span style=color:#f92672>::</span>system_clock<span style=color:#f92672>::</span>time_point<span style=color:#f92672>&gt;</span>(input.at(<span style=color:#e6db74>&#34;o_dt&#34;</span>));
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> time <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>chrono<span style=color:#f92672>::</span>minutes<span style=color:#f92672>&gt;</span>(input.at(<span style=color:#e6db74>&#34;time&#34;</span>)); <span style=color:#75715e>// 12 * 60 + 30 min
</span></span></span></code></pre></div><h3 id=参照を取得できる条件>参照を取得できる条件
<a class=anchor href=#%e5%8f%82%e7%85%a7%e3%82%92%e5%8f%96%e5%be%97%e3%81%a7%e3%81%8d%e3%82%8b%e6%9d%a1%e4%bb%b6>#</a></h3><p><code>toml::get&lt;T></code> は、 <code>T</code><code>toml::value</code> が格納する型そのものだった場合、参照を返すことができます。</p><p>逆に、変換が必要な場合( <code>std::int64_t</code> で格納されている整数を <code>std::uint32_t</code> で取り出そうとした場合)は、
変換後の型への参照を返すことは不可能です。</p><p>変換が必要ない型の場合、返された参照を経由して値を書き換えることも可能です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v(<span style=color:#ae81ff>42</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>toml<span style=color:#f92672>::</span>value<span style=color:#f92672>::</span>integer_type<span style=color:#f92672>&gt;</span>(v) <span style=color:#f92672>=</span> <span style=color:#ae81ff>6</span> <span style=color:#f92672>*</span> <span style=color:#ae81ff>9</span>;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>assert(v.as_integer() <span style=color:#f92672>==</span> <span style=color:#ae81ff>54</span>);
</span></span></code></pre></div><h3 id=配列をstlコンテナに>配列をSTLコンテナに
<a class=anchor href=#%e9%85%8d%e5%88%97%e3%82%92stl%e3%82%b3%e3%83%b3%e3%83%86%e3%83%8a%e3%81%ab>#</a></h3><p>配列の要素型が全て同じ場合、要素型が <code>T</code> に変換可能であれば、 <code>std::vector&lt;T></code> に変換可能です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#a6e22e>a</span> = [<span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>2</span>, <span style=color:#ae81ff>3</span>, <span style=color:#ae81ff>4</span>, <span style=color:#ae81ff>5</span>]
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>vector<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;&gt;</span>(input.at(<span style=color:#e6db74>&#34;a&#34;</span>));
</span></span></code></pre></div><p>他のSTLコンテナにも変換可能です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a1 <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>deque<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;&gt;</span>(input.at(<span style=color:#e6db74>&#34;a&#34;</span>));
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a2 <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>list <span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;&gt;</span>(input.at(<span style=color:#e6db74>&#34;a&#34;</span>));
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a3 <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>array<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span>, <span style=color:#ae81ff>5</span><span style=color:#f92672>&gt;&gt;</span>(input.at(<span style=color:#e6db74>&#34;a&#34;</span>));
</span></span></code></pre></div><p><code>std::array</code> に変換する場合、要素数が一致している必要があります。
もし要素数が一致しなかった場合、 <code>std::out_of_range</code> が送出されます。</p><p>STL以外のコンテナであっても、デフォルトコンストラクタと <code>push_back</code> を持っている場合、
<code>toml::get</code> で変換が可能です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>boost<span style=color:#f92672>::</span>container<span style=color:#f92672>::</span>small_vector<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span>, <span style=color:#ae81ff>8</span><span style=color:#f92672>&gt;&gt;</span>(input.at(<span style=color:#e6db74>&#34;a&#34;</span>));
</span></span></code></pre></div><h3 id=配列を-stdpair-stdtuple-に>配列を <code>std::pair</code>, <code>std::tuple</code>
<a class=anchor href=#%e9%85%8d%e5%88%97%e3%82%92-stdpair-stdtuple-%e3%81%ab>#</a></h3><p>配列の要素型が異なる場合、 <code>std::pair</code><code>std::tuple</code> に変換が可能です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#a6e22e>a</span> = [<span style=color:#66d9ef>true</span>, <span style=color:#ae81ff>3.14</span>]
</span></span><span style=display:flex><span><span style=color:#a6e22e>b</span> = [<span style=color:#ae81ff>42</span>, <span style=color:#ae81ff>2.718</span>, <span style=color:#e6db74>&#34;foo&#34;</span>]
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>pair<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>bool</span>, <span style=color:#66d9ef>double</span><span style=color:#f92672>&gt;&gt;</span>(input.at(<span style=color:#e6db74>&#34;a&#34;</span>));
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> b <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>tuple<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span>, <span style=color:#66d9ef>double</span>, std<span style=color:#f92672>::</span>string<span style=color:#f92672>&gt;&gt;</span>(input.at(<span style=color:#e6db74>&#34;b&#34;</span>));
</span></span></code></pre></div><p><code>std::array</code> の場合と同様に、配列の長さは <code>std::pair</code>, <code>std::tuple</code> の要素数と一致している必要があります。
もし要素数が一致しなかった場合、 <code>std::out_of_range</code> が送出されます。</p><p>また、各要素は対応する要素に変換できる必要があります。
変換できない場合、 <code>toml::type_error</code> が送出されます。</p><h3 id=ネストされた配列の変換>ネストされた配列の変換
<a class=anchor href=#%e3%83%8d%e3%82%b9%e3%83%88%e3%81%95%e3%82%8c%e3%81%9f%e9%85%8d%e5%88%97%e3%81%ae%e5%a4%89%e6%8f%9b>#</a></h3><p>ネストされた配列は、ネストされたコンテナに変換可能です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#a6e22e>a</span> = [ [<span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>2</span>, <span style=color:#ae81ff>3</span>], [<span style=color:#ae81ff>4</span>, <span style=color:#ae81ff>5</span>, <span style=color:#ae81ff>6</span>] ]
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>vector<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>vector<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;&gt;&gt;</span>(input.at(<span style=color:#e6db74>&#34;a&#34;</span>));
</span></span></code></pre></div><p>型が異なる場合には、 <code>std::pair/tuple</code> が便利です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#a6e22e>a</span> = [ [<span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>2</span>, <span style=color:#ae81ff>3</span>], [<span style=color:#e6db74>&#34;foo&#34;</span>, <span style=color:#e6db74>&#34;bar&#34;</span>] ]
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>pair<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>vector<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;</span>, std<span style=color:#f92672>::</span>vector<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>string<span style=color:#f92672>&gt;&gt;</span>
</span></span><span style=display:flex><span> <span style=color:#f92672>&gt;</span>(input.at(<span style=color:#e6db74>&#34;a&#34;</span>));
</span></span></code></pre></div><h3 id=テーブルを-stdmap-に変換>テーブルを <code>std::map</code> に変換
<a class=anchor href=#%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%82%92-stdmap-%e3%81%ab%e5%a4%89%e6%8f%9b>#</a></h3><p>テーブルに含まれる値の型が全て同じであれば、 <code>std::map</code><code>std::unordered_map</code> に変換が可能です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#a6e22e>t</span> = {<span style=color:#a6e22e>a</span> = <span style=color:#ae81ff>1</span>, <span style=color:#a6e22e>b</span> = <span style=color:#ae81ff>2</span>}
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> t <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>map<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>string, <span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;&gt;</span>(input.at(<span style=color:#e6db74>&#34;t&#34;</span>));
</span></span></code></pre></div><p>STL以外のコンテナであっても、デフォルトコンストラクタと <code>emplace(key, mapped)</code> を持っている場合、
<code>toml::get</code> で変換が可能です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> t <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get<span style=color:#f92672>&lt;</span>boost<span style=color:#f92672>::</span>container<span style=color:#f92672>::</span>flat_map<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>string, <span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;&gt;</span>(input.at(<span style=color:#e6db74>&#34;t&#34;</span>));
</span></span></code></pre></div><p>要素型の変換に失敗した場合は <code>toml::type_error</code> が送出されます。</p><h2 id=tomlget_orを使って失敗時の値を指定する><code>toml::get_or</code>を使って失敗時の値を指定する
<a class=anchor href=#tomlget_or%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e5%a4%b1%e6%95%97%e6%99%82%e3%81%ae%e5%80%a4%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b>#</a></h2><p><code>toml::get</code> は変換に失敗した際に <code>toml::type_error</code> 例外を送出します。</p><p><code>toml::get_or</code> を使用することで、変換に失敗した際に例外ではなくデフォルト値を返せるようになります。</p><p><code>toml::get&lt;T></code> とは異なり、 <code>get_or</code> は引数から変換先の型を推論するため、 <code>&lt;T></code> の指定は不要です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get_or(input.at(<span style=color:#e6db74>&#34;a&#34;</span>), <span style=color:#ae81ff>42</span>);
</span></span></code></pre></div><p>変換可能な型は <code>toml::get</code> と同様です。</p><p><code>toml::value::xxx_type</code>を指定した場合は、参照を取り出すことも可能ですが、その場合は引数も参照である必要があります。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>toml<span style=color:#f92672>::</span>value<span style=color:#f92672>::</span>integer_type a_default <span style=color:#f92672>=</span> <span style=color:#ae81ff>42</span>;
</span></span><span style=display:flex><span><span style=color:#66d9ef>auto</span> a<span style=color:#f92672>&amp;</span> <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>get_or(input.at(<span style=color:#e6db74>&#34;a&#34;</span>), a_default);
</span></span></code></pre></div><h2 id=tomlfindtを使って検索と変換を同時に行う><code>toml::find&lt;T></code>を使って検索と変換を同時に行う
<a class=anchor href=#tomlfindt%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e6%a4%9c%e7%b4%a2%e3%81%a8%e5%a4%89%e6%8f%9b%e3%82%92%e5%90%8c%e6%99%82%e3%81%ab%e8%a1%8c%e3%81%86>#</a></h2><p><code>toml::find&lt;T></code> は、テーブルを持つ <code>toml::value</code> から値を検索し、同時に
<code>toml::get</code> と同じ型変換を行って取り出す関数です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>find<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;</span>(input, <span style=color:#e6db74>&#34;a&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#75715e>// const auto a = toml::get&lt;int&gt;(input.at(&#34;a&#34;)); と同じ
</span></span></span></code></pre></div><p><code>toml::find&lt;T></code> は配列にも使用できます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a <span style=color:#f92672>=</span> input.at(<span style=color:#e6db74>&#34;a&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a2 <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>find<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;</span>(a, <span style=color:#ae81ff>2</span>);
</span></span><span style=display:flex><span><span style=color:#75715e>// const auto a2 = toml::get&lt;int&gt;(input.at(&#34;a&#34;).at(2)); と同じ
</span></span></span></code></pre></div><p>型変換の際にエラーが起きた場合、 <code>toml::get</code> と同じ <code>toml::type_error</code>
送出します。
キーが見つからなかった場合またはインデックスが存在しない場合は、
<code>std::out_of_range</code> を送出します。</p><p>型を指定しなかった場合、型変換を行わず <code>toml::value</code> を取り出します。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>find(input, <span style=color:#e6db74>&#34;a&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#75715e>// const auto a = input.at(&#34;a&#34;); と同じ
</span></span></span></code></pre></div><p><code>toml::find&lt;T></code> は再帰的に値にアクセスることもできます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#a6e22e>a</span> = {<span style=color:#a6e22e>b</span> = {<span style=color:#a6e22e>c</span> = <span style=color:#ae81ff>42</span>}}
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a_b_c <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>find<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;</span>(input, <span style=color:#e6db74>&#34;a&#34;</span>, <span style=color:#e6db74>&#34;b&#34;</span>, <span style=color:#e6db74>&#34;c&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#75715e>// const auto a = toml::get&lt;int&gt;(input.at(&#34;a&#34;).at(&#34;b&#34;).at(&#34;c&#34;)); と同じ
</span></span></span></code></pre></div><p>このとき、キーとインデックスを混ぜることができます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#a6e22e>a</span> = [ {<span style=color:#a6e22e>b</span> = <span style=color:#ae81ff>1</span>}, {<span style=color:#a6e22e>b</span> = <span style=color:#ae81ff>2</span>}, {<span style=color:#a6e22e>b</span> = <span style=color:#ae81ff>3</span>} ]
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a_2_b <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>find<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;</span>(input, <span style=color:#e6db74>&#34;a&#34;</span>, <span style=color:#ae81ff>2</span>, <span style=color:#e6db74>&#34;b&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#75715e>// const auto a = toml::get&lt;int&gt;(input.at(&#34;a&#34;).at(2).at(&#34;c&#34;)); と同じ
</span></span></span></code></pre></div><blockquote class="book-hint info"><p>TOMLはquoted keyという機能を持っています。</p><p>これは、 <code>""</code><code>''</code> を使うことで通常許可されない文字をキーに使えるというもので、
この中では <code>.</code> はテーブルを導入<strong>しません</strong></p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#e6db74>&#34;127.0.0.1&#34;</span> = <span style=color:#e6db74>&#34;value&#34;</span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>site</span>.<span style=color:#e6db74>&#34;google.com&#34;</span> = <span style=color:#66d9ef>true</span>
</span></span></code></pre></div><p>このTOMLファイルは以下のようにして読みます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> input <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse(<span style=color:#e6db74>&#34;input.toml&#34;</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>assert(input.at(<span style=color:#e6db74>&#34;127.0.0.1&#34;</span>).as_string() <span style=color:#f92672>==</span> <span style=color:#e6db74>&#34;value&#34;</span>);
</span></span><span style=display:flex><span>assert(input.at(<span style=color:#e6db74>&#34;site&#34;</span>).at(<span style=color:#e6db74>&#34;google.com&#34;</span>).as_boolean());
</span></span></code></pre></div><p>このような場合にも違和感なく対応するため、toml11ではキーに <code>.</code> が含まれていても
自動で分割はしません。</p><p>テーブルの階層構造を陽に指定することが、適切な入力ファイルの構造化に資すると考えているからです。</p><p>参考: <a href=https://toml.io/ja/v1.0.0#%E3%82%AD%E3%83%BC>toml.io キー</a></p></blockquote><h2 id=tomlfind_orを使って失敗時の値を指定する><code>toml::find_or</code>を使って失敗時の値を指定する
<a class=anchor href=#tomlfind_or%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e5%a4%b1%e6%95%97%e6%99%82%e3%81%ae%e5%80%a4%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b>#</a></h2><p><code>toml::find_or</code> は、 <code>toml::get_or</code> と同様に、失敗時のデフォルト値を渡します。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>find_or(input, <span style=color:#e6db74>&#34;a&#34;</span>, <span style=color:#ae81ff>42</span>);
</span></span></code></pre></div><p>型変換の失敗だけでなく、キーが見つからなかった場合もデフォルト値を返します。</p><h2 id=tomlfind_or_defaultを使って失敗時の値を指定する><code>toml::find_or_default</code>を使って失敗時の値を指定する
<a class=anchor href=#tomlfind_or_default%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e5%a4%b1%e6%95%97%e6%99%82%e3%81%ae%e5%80%a4%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%99%e3%82%8b>#</a></h2><p><code>toml::find_or_default</code> は、 <code>toml::find_or</code> と同様に、失敗時にデフォルトコンストラクタの結果を返します。デフォルトコンストラクタは失敗時のみに呼ばれるため、特にそれが高価な時に有効です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>find_or(input, <span style=color:#e6db74>&#34;a&#34;</span>, expensive()); <span style=color:#75715e>// 関数呼出前にコンストラクタ呼出
</span></span></span><span style=display:flex><span><span style=color:#75715e></span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>find_or_default<span style=color:#f92672>&lt;</span>expensive<span style=color:#f92672>&gt;</span>(input, <span style=color:#e6db74>&#34;a&#34;</span>); <span style=color:#75715e>// 失敗時にのみコンストラクタ呼出
</span></span></span></code></pre></div><p>型変換の失敗だけでなく、キーが見つからなかった場合もデフォルトコンストラクタの結果を返します。</p><h2 id=tomlfindstdoptionalt><code>toml::find&lt;std::optional&lt;T>></code>
<a class=anchor href=#tomlfindstdoptionalt>#</a></h2><p>C++17以降の場合、<code>std::optional</code><code>toml::find</code>に指定することができます。</p><p><code>find</code>と同様に、再帰的なアクセスも可能です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> input <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>parse_str(R<span style=color:#e6db74>&#34;(</span>
</span></span><span style=display:flex><span>integer <span style=color:#f92672>=</span> <span style=color:#ae81ff>1</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>[table]
</span></span><span style=display:flex><span>key <span style=color:#f92672>=</span> <span style=color:#ae81ff>2</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>[[array-of-tables]]</span>
</span></span><span style=display:flex><span>key <span style=color:#f92672>=</span> <span style=color:#ae81ff>3</span>
</span></span><span style=display:flex><span>)<span style=color:#e6db74>&#34;);</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> a <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>find<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>optional<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;&gt;</span>(input, <span style=color:#e6db74>&#34;integer&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> b <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>find<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>optional<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;&gt;</span>(input, <span style=color:#e6db74>&#34;table&#34;</span>, <span style=color:#e6db74>&#34;key&#34;</span>);
</span></span><span style=display:flex><span><span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> c <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>find<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>optional<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;&gt;</span>(input, <span style=color:#e6db74>&#34;array-of-tables&#34;</span>, <span style=color:#ae81ff>0</span>, <span style=color:#e6db74>&#34;key&#34;</span>);
</span></span></code></pre></div><p>キーが存在しなかった場合、例外は投げられず、<code>std::nullopt</code>が返却されます。</p><p>ただし、型変換が失敗した場合や、テーブルではない値にキーでアクセスしようとした場合、配列でない値にインデックスでアクセス仕様とした場合は、<code>toml::type_error</code>が送出されます。</p><h2 id=ユーザー定義型との変換を定義する>ユーザー定義型との変換を定義する
<a class=anchor href=#%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e5%ae%9a%e7%be%a9%e5%9e%8b%e3%81%a8%e3%81%ae%e5%a4%89%e6%8f%9b%e3%82%92%e5%ae%9a%e7%be%a9%e3%81%99%e3%82%8b>#</a></h2><p><code>toml::get</code><code>toml::find</code> では、以下のどれかの方法を使うことで
ユーザー定義型を使用することができます。</p><h3 id=tomlfrom-の定義><code>toml::from</code> の定義
<a class=anchor href=#tomlfrom-%e3%81%ae%e5%ae%9a%e7%be%a9>#</a></h3><p>toml11には <code>toml::from</code> という型があり、以下のように特殊化することでユーザー定義型からの
変換をサポートできます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>namespace</span> extlib
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span><span style=color:#66d9ef>struct</span> <span style=color:#a6e22e>foo</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>int</span> a;
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string b;
</span></span><span style=display:flex><span>};
</span></span><span style=display:flex><span>} <span style=color:#75715e>// extlib
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>namespace</span> toml
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span><span style=color:#66d9ef>template</span><span style=color:#f92672>&lt;&gt;</span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>struct</span> <span style=color:#a6e22e>from</span><span style=color:#f92672>&lt;</span>extlib<span style=color:#f92672>::</span>foo<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>static</span> extlib<span style=color:#f92672>::</span>foo from_toml(<span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>&amp;</span> v)
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> extlib<span style=color:#f92672>::</span>foo{
</span></span><span style=display:flex><span> toml<span style=color:#f92672>::</span>find<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;</span>(v, <span style=color:#e6db74>&#34;a&#34;</span>),
</span></span><span style=display:flex><span> toml<span style=color:#f92672>::</span>find<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>string<span style=color:#f92672>&gt;</span>(v, <span style=color:#e6db74>&#34;b&#34;</span>)
</span></span><span style=display:flex><span> };
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>};
</span></span><span style=display:flex><span>} <span style=color:#75715e>// toml
</span></span></span></code></pre></div><p>後述する型設定を変更した <code>toml::value</code> もサポートする場合、以下のようにしてください。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>namespace</span> extlib
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span><span style=color:#66d9ef>struct</span> <span style=color:#a6e22e>foo</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>int</span> a;
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string b;
</span></span><span style=display:flex><span>};
</span></span><span style=display:flex><span>} <span style=color:#75715e>// extlib
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>namespace</span> toml
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span><span style=color:#66d9ef>template</span><span style=color:#f92672>&lt;&gt;</span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>struct</span> <span style=color:#a6e22e>from</span><span style=color:#f92672>&lt;</span>extlib<span style=color:#f92672>::</span>foo<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>template</span><span style=color:#f92672>&lt;</span><span style=color:#66d9ef>typename</span> TC<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>static</span> extlib<span style=color:#f92672>::</span>foo from_toml(<span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>basic_value<span style=color:#f92672>&lt;</span>TC<span style=color:#f92672>&gt;&amp;</span> v)
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> extlib<span style=color:#f92672>::</span>foo{
</span></span><span style=display:flex><span> toml<span style=color:#f92672>::</span>find<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;</span>(v, <span style=color:#e6db74>&#34;a&#34;</span>),
</span></span><span style=display:flex><span> toml<span style=color:#f92672>::</span>find<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>string<span style=color:#f92672>&gt;</span>(v, <span style=color:#e6db74>&#34;b&#34;</span>)
</span></span><span style=display:flex><span> };
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>};
</span></span><span style=display:flex><span>} <span style=color:#75715e>// toml
</span></span></span></code></pre></div><p>この定義は、 <code>TOML11_DEFINE_CONVERSION_NON_INTRUSIVE</code> によって自動的に定義できます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>namespace</span> extlib
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span><span style=color:#66d9ef>struct</span> <span style=color:#a6e22e>foo</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>int</span> a;
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string b;
</span></span><span style=display:flex><span>};
</span></span><span style=display:flex><span>} <span style=color:#75715e>// extlib
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span>TOML11_DEFINE_CONVERSION_NON_INTRUSIVE(extlib<span style=color:#f92672>::</span>foo, a, b)
</span></span></code></pre></div><p>あるいは、リフレクションライブラリを使用することもできます。
<code>example</code><code>boost-ext/reflect</code> を使用したサンプルも参照してください。</p><h3 id=from_toml-メンバ関数の定義><code>from_toml</code> メンバ関数の定義
<a class=anchor href=#from_toml-%e3%83%a1%e3%83%b3%e3%83%90%e9%96%a2%e6%95%b0%e3%81%ae%e5%ae%9a%e7%be%a9>#</a></h3><p><code>from_toml</code> メンバ関数を定義することによっても変換を定義することができます。</p><p>これを使用する場合、デフォルトコンストラクタが必要です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>struct</span> <span style=color:#a6e22e>bar</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>int</span> a;
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string b;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>void</span> <span style=color:#a6e22e>from_toml</span>(<span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>&amp;</span> v)
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> <span style=color:#66d9ef>this</span><span style=color:#f92672>-&gt;</span>a <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>find<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;</span>(v, <span style=color:#e6db74>&#34;a&#34;</span>);
</span></span><span style=display:flex><span> <span style=color:#66d9ef>this</span><span style=color:#f92672>-&gt;</span>b <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>find<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>string<span style=color:#f92672>&gt;</span>(v, <span style=color:#e6db74>&#34;b&#34;</span>);
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> ;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>};
</span></span></code></pre></div><p>両方が定義されていた場合、 <code>toml::from</code> が優先されます。</p><h3 id=tomlvalue-を受け取るコンストラクタ><code>toml::value</code> を受け取るコンストラクタ
<a class=anchor href=#tomlvalue-%e3%82%92%e5%8f%97%e3%81%91%e5%8f%96%e3%82%8b%e3%82%b3%e3%83%b3%e3%82%b9%e3%83%88%e3%83%a9%e3%82%af%e3%82%bf>#</a></h3><p><code>toml::value</code> を受け取るコンストラクタがあれば、 <code>toml::get</code> による変換ができます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>struct</span> <span style=color:#a6e22e>baz</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>explicit</span> <span style=color:#a6e22e>baz</span>(<span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>&amp;</span> v)
</span></span><span style=display:flex><span> <span style=color:#f92672>:</span> a(toml<span style=color:#f92672>::</span>find<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>int</span><span style=color:#f92672>&gt;</span>(v, <span style=color:#e6db74>&#34;a&#34;</span>)), b(toml<span style=color:#f92672>::</span>find<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>string<span style=color:#f92672>&gt;</span>(v, <span style=color:#e6db74>&#34;b&#34;</span>))
</span></span><span style=display:flex><span> {}
</span></span><span style=display:flex><span> <span style=color:#66d9ef>int</span> a;
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string b;
</span></span><span style=display:flex><span>};
</span></span></code></pre></div><p>両方が定義されていた場合、<code>toml::from</code><code>from_toml</code> が優先されます。</p><h2 id=tomlvisitで関数を適用する><code>toml::visit</code>で関数を適用する
<a class=anchor href=#tomlvisit%e3%81%a7%e9%96%a2%e6%95%b0%e3%82%92%e9%81%a9%e7%94%a8%e3%81%99%e3%82%8b>#</a></h2><p><code>toml::value</code> が格納する型すべてに適用できる関数オブジェクトがあれば、
<code>toml::visit</code> によって型変換を経ずに直接その関数を呼ぶことができます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>struct</span> <span style=color:#a6e22e>type_name_of</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string <span style=color:#66d9ef>operator</span>()(<span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>::</span>boolean_type <span style=color:#f92672>&amp;</span>) <span style=color:#66d9ef>const</span> {<span style=color:#66d9ef>return</span> <span style=color:#e6db74>&#34;boolean&#34;</span>;}
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string <span style=color:#66d9ef>operator</span>()(<span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>::</span>integer_type <span style=color:#f92672>&amp;</span>) <span style=color:#66d9ef>const</span> {<span style=color:#66d9ef>return</span> <span style=color:#e6db74>&#34;integer&#34;</span>;}
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string <span style=color:#66d9ef>operator</span>()(<span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>::</span>floating_type <span style=color:#f92672>&amp;</span>) <span style=color:#66d9ef>const</span> {<span style=color:#66d9ef>return</span> <span style=color:#e6db74>&#34;floating&#34;</span>;}
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string <span style=color:#66d9ef>operator</span>()(<span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>::</span>string_type <span style=color:#f92672>&amp;</span>) <span style=color:#66d9ef>const</span> {<span style=color:#66d9ef>return</span> <span style=color:#e6db74>&#34;string&#34;</span>;}
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string <span style=color:#66d9ef>operator</span>()(<span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>::</span>local_time_type <span style=color:#f92672>&amp;</span>) <span style=color:#66d9ef>const</span> {<span style=color:#66d9ef>return</span> <span style=color:#e6db74>&#34;local_time&#34;</span>;}
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string <span style=color:#66d9ef>operator</span>()(<span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>::</span>local_date_type <span style=color:#f92672>&amp;</span>) <span style=color:#66d9ef>const</span> {<span style=color:#66d9ef>return</span> <span style=color:#e6db74>&#34;local_date&#34;</span>;}
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string <span style=color:#66d9ef>operator</span>()(<span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>::</span>local_datetime_type <span style=color:#f92672>&amp;</span>) <span style=color:#66d9ef>const</span> {<span style=color:#66d9ef>return</span> <span style=color:#e6db74>&#34;local_datetime&#34;</span>;}
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string <span style=color:#66d9ef>operator</span>()(<span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>::</span>offset_datetime_type<span style=color:#f92672>&amp;</span>) <span style=color:#66d9ef>const</span> {<span style=color:#66d9ef>return</span> <span style=color:#e6db74>&#34;offset_datetime&#34;</span>;}
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string <span style=color:#66d9ef>operator</span>()(<span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>::</span>array_type <span style=color:#f92672>&amp;</span>) <span style=color:#66d9ef>const</span> {<span style=color:#66d9ef>return</span> <span style=color:#e6db74>&#34;array&#34;</span>;}
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string <span style=color:#66d9ef>operator</span>()(<span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>::</span>table_type <span style=color:#f92672>&amp;</span>) <span style=color:#66d9ef>const</span> {<span style=color:#66d9ef>return</span> <span style=color:#e6db74>&#34;table&#34;</span>;}
</span></span><span style=display:flex><span>};
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v(<span style=color:#ae81ff>3.14</span>);
</span></span><span style=display:flex><span>std<span style=color:#f92672>::</span>cout <span style=color:#f92672>&lt;&lt;</span> toml<span style=color:#f92672>::</span>visit(type_name_of{}, v) <span style=color:#f92672>&lt;&lt;</span> std<span style=color:#f92672>::</span>endl; <span style=color:#75715e>// floating
</span></span></span></code></pre></div><h2 id=tomlvalue-を構築する><code>toml::value</code> を構築する
<a class=anchor href=#tomlvalue-%e3%82%92%e6%a7%8b%e7%af%89%e3%81%99%e3%82%8b>#</a></h2><p><code>toml::value</code> はパーサの内部だけでなく、ユーザーコードで構築することも可能です。</p><p><code>toml::value</code> が格納する型と同じか変換可能な型を渡しての構築が可能です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v1(true);
</span></span><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v2(<span style=color:#ae81ff>42</span>);
</span></span><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v3(<span style=color:#ae81ff>3.14</span>);
</span></span></code></pre></div><p>配列の場合、 <code>toml::array</code> を使うか、</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v(toml<span style=color:#f92672>::</span>array{<span style=color:#ae81ff>1</span>, <span style=color:#ae81ff>2</span>, <span style=color:#ae81ff>3</span>});
</span></span></code></pre></div><p>配列の場合、 <code>std::vector</code> などのコンテナを直接渡すことが可能です。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span>vector<span style=color:#f92672>&lt;</span>toml<span style=color:#f92672>::</span>value<span style=color:#f92672>&gt;</span> a{<span style=color:#ae81ff>1</span>,<span style=color:#ae81ff>2</span>,<span style=color:#ae81ff>3</span>};
</span></span><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v(a);
</span></span></code></pre></div><p>このコンテナには、 <code>toml::get</code> で変換可能なコンテナが使用できます。</p><p>テーブルの場合も同様に、 <code>toml::table</code> を使うか、</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v(toml<span style=color:#f92672>::</span>table{{<span style=color:#e6db74>&#34;foo&#34;</span>, <span style=color:#ae81ff>1</span>}, {<span style=color:#e6db74>&#34;bar&#34;</span>, <span style=color:#ae81ff>2</span>}, {<span style=color:#e6db74>&#34;baz&#34;</span>, <span style=color:#ae81ff>3</span>}});
</span></span></code></pre></div><p><code>std::map</code> などのコンテナを直接渡します。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>const</span> std<span style=color:#f92672>::</span>map<span style=color:#f92672>&lt;</span>std<span style=color:#f92672>::</span>string, toml<span style=color:#f92672>::</span>value<span style=color:#f92672>&gt;</span> t{
</span></span><span style=display:flex><span> {<span style=color:#e6db74>&#34;foo&#34;</span>, <span style=color:#ae81ff>1</span>}, {<span style=color:#e6db74>&#34;bar&#34;</span>, <span style=color:#ae81ff>2</span>}, {<span style=color:#e6db74>&#34;baz&#34;</span>, <span style=color:#ae81ff>3</span>}
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v(t);
</span></span></code></pre></div><p>コンストラクタには、 <code>format_info</code> と コメントを渡すことができます。</p><p>コメントの型は <code>std::vector&lt;std::string></code> です。
各要素が一行分に相当します。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span>toml<span style=color:#f92672>::</span>integer_format_info fmt;
</span></span><span style=display:flex><span>fmt.fmt <span style=color:#f92672>=</span> toml<span style=color:#f92672>::</span>integer_format<span style=color:#f92672>::</span>hex;
</span></span><span style=display:flex><span>fmt.spacer <span style=color:#f92672>=</span> <span style=color:#ae81ff>4</span>;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v1(<span style=color:#ae81ff>0xDEADBEEF</span>, fmt);
</span></span><span style=display:flex><span>toml<span style=color:#f92672>::</span>value v2(<span style=color:#ae81ff>0xC0FFEE</span>, fmt, {<span style=color:#e6db74>&#34;hex value!&#34;</span>});
</span></span></code></pre></div><h2 id=tomlvalue-に変換する><code>toml::value</code> に変換する
<a class=anchor href=#tomlvalue-%e3%81%ab%e5%a4%89%e6%8f%9b%e3%81%99%e3%82%8b>#</a></h2><p>ユーザー定義型から <code>toml::value</code> を構築する際に、 <code>toml::into</code><code>into_toml</code>
定義することで、その挙動をカスタマイズできます。</p><p>特に、別のライブラリの型などを変換する際に <code>toml::into</code> が便利です。</p><h3 id=tomlintoを定義する><code>toml::into</code>を定義する
<a class=anchor href=#tomlinto%e3%82%92%e5%ae%9a%e7%be%a9%e3%81%99%e3%82%8b>#</a></h3><p><code>toml::into</code> を特殊化することで <code>toml::value</code> への変換が可能になります。</p><p><code>toml::value</code> への変換が用意されていない外部ライブラリの型などに対して有効です。</p><p><code>toml::value</code> が変換時に <code>type_config</code> を渡すため、<code>basic_value</code><code>template</code> 引数を受け取る必要があります。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>namespace</span> extlib
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span><span style=color:#66d9ef>struct</span> <span style=color:#a6e22e>foo</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>int</span> a;
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string b;
</span></span><span style=display:flex><span>};
</span></span><span style=display:flex><span>} <span style=color:#75715e>// extlib
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>template</span><span style=color:#f92672>&lt;&gt;</span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>struct</span> <span style=color:#a6e22e>into</span><span style=color:#f92672>&lt;</span>extlib<span style=color:#f92672>::</span>foo<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>template</span><span style=color:#f92672>&lt;</span><span style=color:#66d9ef>typename</span> TC<span style=color:#f92672>&gt;</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>static</span> toml<span style=color:#f92672>::</span>basic_value<span style=color:#f92672>&lt;</span>TC<span style=color:#f92672>&gt;</span> into_toml(<span style=color:#66d9ef>const</span> extlib<span style=color:#f92672>::</span>foo<span style=color:#f92672>&amp;</span> f)
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> toml<span style=color:#f92672>::</span>basic_value<span style=color:#f92672>&lt;</span>TC<span style=color:#f92672>&gt;</span>(<span style=color:#66d9ef>typename</span> toml<span style=color:#f92672>::</span>basic_value<span style=color:#f92672>&lt;</span>TC<span style=color:#f92672>&gt;::</span>table_type{{<span style=color:#e6db74>&#34;a&#34;</span>, f.a}, {<span style=color:#e6db74>&#34;b&#34;</span>, f.b}});
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>};
</span></span></code></pre></div><h3 id=into_toml-メンバ関数を定義する><code>into_toml</code> メンバ関数を定義する
<a class=anchor href=#into_toml-%e3%83%a1%e3%83%b3%e3%83%90%e9%96%a2%e6%95%b0%e3%82%92%e5%ae%9a%e7%be%a9%e3%81%99%e3%82%8b>#</a></h3><p><code>from_toml</code> と同様、メンバ関数によっても変換を定義することができます。</p><p><code>toml::into</code> が定義されていた場合、そちらが優先されます。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#66d9ef>struct</span> <span style=color:#a6e22e>bar</span>
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>int</span> a;
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>string b;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> toml<span style=color:#f92672>::</span>value into_toml() <span style=color:#66d9ef>const</span>
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> toml<span style=color:#f92672>::</span>value(toml<span style=color:#f92672>::</span>table{{<span style=color:#e6db74>&#34;a&#34;</span>, <span style=color:#66d9ef>this</span><span style=color:#f92672>-&gt;</span>a}, {<span style=color:#e6db74>&#34;b&#34;</span>, <span style=color:#66d9ef>this</span><span style=color:#f92672>-&gt;</span>b}});
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>};
</span></span></code></pre></div><h1 id=値がアクセス済みかどうかチェックする>値がアクセス済みかどうかチェックする
<a class=anchor href=#%e5%80%a4%e3%81%8c%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e6%b8%88%e3%81%bf%e3%81%8b%e3%81%a9%e3%81%86%e3%81%8b%e3%83%81%e3%82%a7%e3%83%83%e3%82%af%e3%81%99%e3%82%8b>#</a></h1><p><code>TOML11_ENABLE_ACCESS_CHECK</code>マクロを定義してコンパイルすると、<code>toml::value</code><code>bool accessed() const</code>メソッドが追加され、パース後にその値にアクセスしたかどうかが確認できるようになります。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-console data-lang=console><span style=display:flex><span>$ g++ -std<span style=color:#f92672>=</span>c++17 -O2 -DTOML11_ENABLE_ACCESS_CHECK -I/path/to/toml11/include main.cpp
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-console data-lang=console><span style=display:flex><span>$ cmake -B ./build -DTOML11_ENABLE_ACCESS_CHECK<span style=color:#f92672>=</span>ON
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cmake data-lang=cmake><span style=display:flex><span>CPMAddPackage(
</span></span><span style=display:flex><span> <span style=color:#e6db74>NAME</span> <span style=color:#e6db74>toml11</span>
</span></span><span style=display:flex><span> <span style=color:#e6db74>GITHUB_REPOSITORY</span> <span style=color:#e6db74>&#34;ToruNiina/toml11&#34;</span>
</span></span><span style=display:flex><span> <span style=color:#e6db74>VERSION</span> <span style=color:#e6db74>4.4.0</span>
</span></span><span style=display:flex><span> <span style=color:#e6db74>OPTIONS</span> <span style=color:#e6db74>&#34;CMAKE_CXX_STANDARD 17&#34;</span> <span style=color:#e6db74>&#34;TOML11_PRECOMPILE ON&#34;</span> <span style=color:#e6db74>&#34;TOML11_ENABLE_ACCESS_CHECK ON&#34;</span>
</span></span><span style=display:flex><span> )<span style=color:#960050;background-color:#1e0010>
</span></span></span></code></pre></div><p>この機能によって、テーブル内に定義されているものの使用されなかった値についての警告を表示することが可能になります。</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-cpp data-lang=cpp><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;toml.hpp&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>namespace</span> yours
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Config <span style=color:#a6e22e>read_config</span>(<span style=color:#66d9ef>const</span> toml<span style=color:#f92672>::</span>value<span style=color:#f92672>&amp;</span> v)
</span></span><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span> cfg <span style=color:#f92672>=</span> read_your_config(input);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span>(<span style=color:#66d9ef>const</span> <span style=color:#66d9ef>auto</span><span style=color:#f92672>&amp;</span> [k, v] <span style=color:#f92672>:</span> input.as_table())
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span>( <span style=color:#f92672>!</span> v.accessed())
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> std<span style=color:#f92672>::</span>cerr <span style=color:#f92672>&lt;&lt;</span> toml<span style=color:#f92672>::</span>format_error(<span style=color:#e6db74>&#34;value defined but not used&#34;</span>,
</span></span><span style=display:flex><span> v.source_location(), <span style=color:#e6db74>&#34;not used&#34;</span>);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> cfg;
</span></span><span style=display:flex><span>}
</span></span><span style=display:flex><span>} <span style=color:#75715e>// yours
</span></span></span></code></pre></div><p>この機能は、必要な場合のみ定義されるような値を、名称を間違えて定義してしまった際に役に立つでしょう。
例えば、</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#75715e># 正しくは reactions </span>
</span></span><span style=display:flex><span><span style=color:#75715e># reactions = [ &#34;:+1:&#34;, &#34;star&#34; ]</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#75715e># 名前が違うので読み込めない</span>
</span></span><span style=display:flex><span><span style=color:#a6e22e>reaction</span> = [ <span style=color:#e6db74>&#34;:+1:&#34;</span>, <span style=color:#e6db74>&#34;star&#34;</span> ]
</span></span></code></pre></div><p>このファイルを上記のコードで読んだ場合、<code>read_your_config</code><code>reactions</code>を探し、定義されていなかったので空の配列として処理するでしょう。
その場合、<code>reaction</code><code>accessed()</code><code>true</code>にならないため、エラーとして検出できます。</p></article><footer class=book-footer><div class="flex flex-wrap justify-between"></div><script>(function(){function e(e){const t=window.getSelection(),n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}document.querySelectorAll("pre code").forEach(t=>{t.addEventListener("click",function(){if(window.getSelection().toString())return;e(t.parentElement),navigator.clipboard&&navigator.clipboard.writeText(t.parentElement.textContent)})})})()</script></footer><label for=menu-control class="hidden book-menu-overlay"></label></div><aside class=book-toc><div class=book-toc-content><nav id=TableOfContents><ul><li><a href=#値を取り出す>値を取り出す</a><ul><li><a href=#メンバ関数を使って値にアクセスする>メンバ関数を使って値にアクセスする</a><ul><li><a href=#is_something-と-as_something><code>is_something</code><code>as_something</code></a></li><li><a href=#tomlvalue_t><code>toml::value_t</code></a></li><li><a href=#at--contains-size-push_back-emplace_back><code>at</code>, <code>[]</code>, <code>contains</code>, <code>size</code>, <code>push_back</code>, <code>emplace_back</code></a></li></ul></li><li><a href=#コメントにアクセスする>コメントにアクセスする</a></li><li><a href=#インラインテーブルドットキーの取り扱い>インラインテーブル・ドットキーの取り扱い</a></li><li><a href=#日付情報の取り扱い>日付情報の取り扱い</a></li><li><a href=#tomlgettを使って変換する><code>toml::get&lt;T></code>を使って変換する</a><ul><li><a href=#単純な変換>単純な変換</a></li><li><a href=#参照を取得できる条件>参照を取得できる条件</a></li><li><a href=#配列をstlコンテナに>配列をSTLコンテナに</a></li><li><a href=#配列を-stdpair-stdtuple-に>配列を <code>std::pair</code>, <code>std::tuple</code></a></li><li><a href=#ネストされた配列の変換>ネストされた配列の変換</a></li><li><a href=#テーブルを-stdmap-に変換>テーブルを <code>std::map</code> に変換</a></li></ul></li><li><a href=#tomlget_orを使って失敗時の値を指定する><code>toml::get_or</code>を使って失敗時の値を指定する</a></li><li><a href=#tomlfindtを使って検索と変換を同時に行う><code>toml::find&lt;T></code>を使って検索と変換を同時に行う</a></li><li><a href=#tomlfind_orを使って失敗時の値を指定する><code>toml::find_or</code>を使って失敗時の値を指定する</a></li><li><a href=#tomlfind_or_defaultを使って失敗時の値を指定する><code>toml::find_or_default</code>を使って失敗時の値を指定する</a></li><li><a href=#tomlfindstdoptionalt><code>toml::find&lt;std::optional&lt;T>></code></a></li><li><a href=#ユーザー定義型との変換を定義する>ユーザー定義型との変換を定義する</a><ul><li><a href=#tomlfrom-の定義><code>toml::from</code> の定義</a></li><li><a href=#from_toml-メンバ関数の定義><code>from_toml</code> メンバ関数の定義</a></li><li><a href=#tomlvalue-を受け取るコンストラクタ><code>toml::value</code> を受け取るコンストラクタ</a></li></ul></li><li><a href=#tomlvisitで関数を適用する><code>toml::visit</code>で関数を適用する</a></li><li><a href=#tomlvalue-を構築する><code>toml::value</code> を構築する</a></li><li><a href=#tomlvalue-に変換する><code>toml::value</code> に変換する</a><ul><li><a href=#tomlintoを定義する><code>toml::into</code>を定義する</a></li><li><a href=#into_toml-メンバ関数を定義する><code>into_toml</code> メンバ関数を定義する</a></li></ul></li></ul></li><li><a href=#値がアクセス済みかどうかチェックする>値がアクセス済みかどうかチェックする</a></li></ul></nav></div></aside></main></body></html>