features on toml11https://toruniina.github.io/toml11/ja/docs/features/Recent content in features on toml11Hugojaparsing fileshttps://toruniina.github.io/toml11/ja/docs/features/parsing_files/Mon, 01 Jan 0001 00:00:00 +0000https://toruniina.github.io/toml11/ja/docs/features/parsing_files/<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&gt;</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&gt;</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>getting valueshttps://toruniina.github.io/toml11/ja/docs/features/value/Mon, 01 Jan 0001 00:00:00 +0000https://toruniina.github.io/toml11/ja/docs/features/value/<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>error messagehttps://toruniina.github.io/toml11/ja/docs/features/error_message/Mon, 01 Jan 0001 00:00:00 +0000https://toruniina.github.io/toml11/ja/docs/features/error_message/<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&gt;/find&lt;T&gt;</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>serializing valueshttps://toruniina.github.io/toml11/ja/docs/features/serialize/Mon, 01 Jan 0001 00:00:00 +0000https://toruniina.github.io/toml11/ja/docs/features/serialize/<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>configuring typeshttps://toruniina.github.io/toml11/ja/docs/features/configure_types/Mon, 01 Jan 0001 00:00:00 +0000https://toruniina.github.io/toml11/ja/docs/features/configure_types/<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&gt;</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&gt;, std::allocator&lt;char&gt;&gt;</code> の エイリアスであるように、 <code>toml::value</code> は実際には <code>toml::basic_value&lt;toml::type_config&gt;</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&gt;</code> は、格納する <code>boolean_type</code> を <code>TypeConfig::boolean_type</code>、 格納する <code>integer_type</code> を <code>TypeConfig::integer_type</code> 、のようにして定義しています。</p>toml literalhttps://toruniina.github.io/toml11/ja/docs/features/literal/Mon, 01 Jan 0001 00:00:00 +0000https://toruniina.github.io/toml11/ja/docs/features/literal/<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>&quot;&quot;_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>toml spechttps://toruniina.github.io/toml11/ja/docs/features/toml_spec/Mon, 01 Jan 0001 00:00:00 +0000https://toruniina.github.io/toml11/ja/docs/features/toml_spec/<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>extensionhttps://toruniina.github.io/toml11/ja/docs/features/extension/Mon, 01 Jan 0001 00:00:00 +0000https://toruniina.github.io/toml11/ja/docs/features/extension/<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>&quot;null&quot;</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>