Files
toml11/ja/docs/features/value/index.html
ToruNiina e671b8e3bd Merge pull request #291 from franzpoeschel/namespace-versioning
Use an inline namespace to distinguish emitted symbols by version numbers e4051f77d7
2025-05-17 07:21:19 +00:00

484 lines
114 KiB
HTML

<!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>