<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>はらぺこ日誌 &#187; C++0x</title>
	<atom:link href="https://blog.harapeko.jp/tag/c0x/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.harapeko.jp</link>
	<description>株式会社はらぺこ 公式ブログ</description>
	<lastBuildDate>Mon, 30 Oct 2017 14:32:56 +0000</lastBuildDate>
	<language>ja</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.2</generator>
	<item>
		<title>コンテナの種類は問わないが、要素の型は限定したい。</title>
		<link>https://blog.harapeko.jp/2012/09/27/type-traits/</link>
		<comments>https://blog.harapeko.jp/2012/09/27/type-traits/#comments</comments>
		<pubDate>Thu, 27 Sep 2012 06:15:10 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++0x]]></category>
		<category><![CDATA[C++11]]></category>
		<category><![CDATA[STL]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=257</guid>
		<description><![CDATA[C++ で STL などによる任意のコンテナを引数に取る関数を実装する際、そのコンテナの種類は問わないものの、 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>C++ で STL などによる任意のコンテナを引数に取る関数を実装する際、そのコンテナの種類は問わないものの、そのコンテナが持つ要素の型は限定したい、あるいは要素の型に応じて処理内容を切り替えたい、といったニーズがあると思います。</p>
<p>そのような場合、 C++11 であれば、 <a href="https://sites.google.com/site/cpprefjp/reference/type_traits" title="type_traits - cpprefjp - C++ Library Reference">&lt;type_traits&gt;</a> を利用します。</p>
<p>以下は、整数の型を要素に持つ任意のコンテナを受け取り、その全要素の合計を返す関数 <code>calcSum()</code> の実装例です。<br />
<span id="more-257"></span></p>
<pre>
#include &lt;iostream&gt;
#include &lt;type_traits&gt;
#include &lt;array&gt;
#include &lt;set&gt;

extern void * enabler;

template &lt;typename cont_t, typename value_type = typename cont_t::value_type,
    typename std::enable_if&lt;std::is_integral&lt;typename cont_t::value_type&gt;::value&gt;::type *&amp; = enabler&gt;
value_type calcSum(cont_t const&amp; container)
{
    value_type sum = 0;
    for (auto n : container)
        sum += n;
    return sum;
}

int main()
{
    std::array&lt;int, 5&gt; primes = { 2, 3, 5, 7, 11 };
    for (int i = 0; i &lt; primes.size(); i++)
        std::cout &lt;&lt; (i == 0 ? &quot;&quot; : &quot; + &quot;) &lt;&lt; primes[i];
    std::cout &lt;&lt; &quot; = &quot; &lt;&lt; calcSum(primes) &lt;&lt; std::endl;
    
    // std::array&lt;double, 5&gt; floating_nums = { 1.414, 1.732, 2.236, 2.718, 3.142 };
    // auto result = calcSum(floating_nums);    // エラー: そんな関数無いよ
    
    std::multiset&lt;short&gt; nums = { 152, 24, 73, -15, 250, 3, 24 };
    bool is_first = true;
    for (auto num : nums) {
        std::cout &lt;&lt; (is_first ? &quot;&quot; : &quot; + &quot;) &lt;&lt; num;
        is_first = false;
    }
    std::cout &lt;&lt; &quot; = &quot; &lt;&lt; calcSum(nums) &lt;&lt; std::endl;
    
    return 0;
}
</pre>
<p>実行結果は以下の通りです。</p>
<pre>
2 + 3 + 5 + 7 + 11 = 28
-15 + 3 + 24 + 24 + 73 + 152 + 250 = 511
</pre>
<p>Boost ライブラリを含む C++ 全般の話題を追い続けてきた人であれば当然ご存じの知識だと思います。ええ、そうです、今回は完全に自分用のメモです (汗。こういう書き方があること自体は認識していたのですが、いやー、やっぱり実際に使わないことには身につかないですね <tt>(^_^;A</tt> 。</p>
<p>基本的には、テンプレートの中で、制限したい通りの条件に適合する場合のみ <code>true</code> になるような定数式を <code>std::enable_if&lt;</code> ～ <code>&gt;</code> で括ってやり、そのクラスメンバである型 <code>type</code> を <code>typename</code> として評価する、というものです。この <code>std::enable_if&lt;foobar&gt;::type</code> は、 <code> foobar</code> が <code>true</code> になる場合のみ (テンプレートの特殊化によって) 定義されるような仕組みになっていて、これが <code>false</code> になってしまう (すなわち、あなたの指定したい条件に合致しない) 呼び出し方をしようとすると、単にオーバーロードできないケースとして無視されます。</p>
<p>上記のケースでは要素が整数型以外の場合はオーバーロード可能な関数が存在しないものとしてコンパイルエラーになりますが、別途浮動小数点用の実装や <code>std::complex&lt;T&gt;</code> 用の実装、さらには <code>std::string</code> 用の実装なんかも用意してあげることで、それぞれに独自の処理を実現させるということもできちゃう、という寸法です。便利。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2012/09/27/type-traits/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>unorderd_map のキーに enum 型を使用する</title>
		<link>https://blog.harapeko.jp/2012/01/02/stl-enum-hash/</link>
		<comments>https://blog.harapeko.jp/2012/01/02/stl-enum-hash/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 22:45:38 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[活動記録]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++0x]]></category>
		<category><![CDATA[C++11]]></category>
		<category><![CDATA[STL]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=235</guid>
		<description><![CDATA[新年明けましておめでとうございます。去年はちっとも儲からなかったので、今年は本腰入れて開発やって自力で稼げる事 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>新年明けましておめでとうございます。去年はちっとも儲からなかったので、今年は本腰入れて開発やって自力で稼げる事業を立ち上げたく、その準備を進めて参る所存でございます。どうぞ生暖かく見守っていただければと思います…。</p>
<p>さて、<a href="http://blog.harapeko.jp/2011/12/27/cpp11-unicode/">前回の記事</a>でお見せした、 iconv のラッパークラスをテンプレートクラスに作り直す際、 <code>&lt;unorderd_map&gt;</code> を利用していて気づいたことの備忘録です。</p>
<ul>
<li><a href="http://developer.harapeko.jp/trac/original/otoco/browser/trunk/sample/EncodeString.hpp?rev=16">EncodeString.hpp</a></li>
<li><a href="http://developer.harapeko.jp/trac/original/otoco/browser/trunk/sample/EncodeString.cpp?rev=16">EncodeString.cpp</a></li>
</ul>
<p><span id="more-235"></span></p>
<h3>問題</h3>
<p>テンプレート引数に、内部文字列の (アラインメントを決定する) 物理型と文字セットを指定できるようにしたかったのですが、文字セットを示す文字列そのものをテンプレート引数に渡すことはできないので、代わりに文字セットを表す列挙値を定義し、対応する「文字セットを表す文字列」と関連づけた連想配列を <code>&lt;unorderd_map&gt;</code> を用いて用意する、ということをやってみることにしました。 C/C++ の列挙値は <code>int</code> にキャスト可能なので昔の自分だったら単純に「文字セットを表す文字列」の配列を用意して添え字代わりに列挙値を突っ込むところですが、メンテナンス性良くないですし、ハッシュテーブルなら検索コストは (ほぼ) 変わらないですからね。</p>
<p>で、ヘッダファイルの方で列挙型を定義しーの、</p>
<pre>
enum charset_t {
    chset_Utf8, chset_C99, chset_Java,
    chset_Ucs2, chset_Ucs2Be, chset_Ucs2Le,
    chset_Ucs4, chset_Ucs4Be, chset_Ucs4Le,
    chset_Utf16, chset_Utf16Be, chset_Utf16Le,
    chset_Utf32, chset_Utf32Be, chset_Utf32Le,
    chset_Utf7,
    chset_EucJp, chset_EucJis0213,
    chset_Iso2022Jp, chset_Iso2022Jp2, chset_Iso2022Jp1, chset_Iso2022Jp3,
    chset_ShiftJis, chset_Cp932, chset_ShiftJisX0213,
};
</pre>
<p>テンプレート化しない実装部分のクラスに <code>static</code> で <code>const</code> な連想配列メンバを追加しーの、</p>
<pre>
class EncodeStringImpl
{
    typedef std::unordered_map&lt;charset_t, char const *&gt; cnmap_t;
    static cnmap_t const CharsetNames;

    // ...
};
</pre>
<p>実装ファイルの方で連想配列の値を定義しーの、</p>
<pre>
EncodeStringImpl::cnmap_t const EncodeStringImpl::CharsetNames = {
    { chset_Utf8, &quot;UTF-8&quot; }, { chset_C99, &quot;C99&quot; }, { chset_Java, &quot;JAVA&quot; },
    { chset_Ucs2, &quot;UCS-2&quot; }, { chset_Ucs2Be, &quot;UCS-2BE&quot; }, { chset_Ucs2Le, &quot;UCS-2LE&quot; },
    { chset_Ucs4, &quot;UCS-4&quot; }, { chset_Ucs4Be, &quot;UCS-4BE&quot; }, { chset_Ucs4Le, &quot;UCS-4LE&quot; },
    { chset_Utf16, &quot;UTF-16&quot; }, { chset_Utf16Be, &quot;UTF-16BE&quot; }, { chset_Utf16Le, &quot;UTF-16LE&quot; },
    { chset_Utf32, &quot;UTF-32&quot; }, { chset_Utf32Be, &quot;UTF-32BE&quot; }, { chset_Utf32Le, &quot;UTF-32LE&quot; },
    { chset_Utf7, &quot;UTF-7&quot; },
    { chset_EucJp, &quot;EUC-JP&quot; }, { chset_EucJis0213, &quot;EUC-JISX0213&quot; },
    { chset_Iso2022Jp, &quot;ISO-2022-JP&quot; }, { chset_Iso2022Jp2, &quot;ISO-2022-JP2&quot; },
    { chset_Iso2022Jp1, &quot;ISO-2022-JP1&quot; }, { chset_Iso2022Jp3, &quot;ISO-2022-JP3&quot; },
    { chset_ShiftJis, &quot;SHIFT_JIS&quot; }, { chset_Cp932, &quot;CP932&quot; }, { chset_ShiftJisX0213, &quot;SHIFT_JISX0213&quot; },
};
</pre>
<p>実際に使いーの、とやってみたはよいのですが、</p>
<pre>
void EncodeStringImpl::encode(void const *src, size_t src_length, size_t chr_size, charset_t from_charset,
    charset_t to_charset)
{

    // ...

    class auto_iconv_t {    // 生成時に iconv_open してスコープ抜ける時に iconv_close するプライベートクラス…
        const iconv_t impl;
    public:
        auto_iconv_t(charset_t from_cs, charset_t to_cs) :
            // ↓こことか
            impl(iconv_open(CharsetNames.find(to_cs)-&gt;second, CharsetNames.find(from_cs)-&gt;second))
        {
            if (impl == reinterpret_cast&lt;iconv_t&gt;(-1)) {
                // ↓こことか
                throw EncodeStringException(string(&quot;LIBICONV initialize error: please check character set name \&quot;&quot;) +
                    CharsetNames.find(from_cs)-&gt;second + &quot;\&quot;(from) or \&quot;&quot; + CharsetNames.find(to_cs)-&gt;second +
                    &quot;\&quot;(to)&quot;);
            }
        }
        ~auto_iconv_t() { iconv_close(impl); }
        iconv_t get() const { return impl; }
    } iconv_handle(from_charset, to_charset);
</pre>
<p>いざ <code>g++</code> してみると、「<q><code>std::hash&lt;charset_t&gt;::operator()(charset_t) const</code></q> なんて定義されてねーよ」とリンカ様に怒られてしまいました。</p>
<pre>
murachi@ubuntu-vbox:~/otoco/trunk/sample$ g++ -std=c++0x -o kumapan EncodeString.cpp kumapan.cpp 
/tmp/ccIn30PX.o: In function `std::__detail::_Hash_code_base&lt;charset_t, std::pair&lt;charset_t const, char const*&gt;, std::_Select1st&lt;std::pair&lt;charset_t const, char const*&gt; &gt;, std::equal_to&lt;charset_t&gt;, std::hash&lt;charset_t&gt;, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false&gt;::_M_hash_code(charset_t const&amp;) const':
EncodeString.cpp:(.text._ZNKSt8__detail15_Hash_code_baseI9charset_tSt4pairIKS1_PKcESt10_Select1stIS6_ESt8equal_toIS1_ESt4hashIS1_ENS_18_Mod_range_hashingENS_20_Default_ranged_hashELb0EE12_M_hash_codeERS3_[std::__detail::_Hash_code_base&lt;charset_t, std::pair&lt;charset_t const, char const*&gt;, std::_Select1st&lt;std::pair&lt;charset_t const, char const*&gt; &gt;, std::equal_to&lt;charset_t&gt;, std::hash&lt;charset_t&gt;, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false&gt;::_M_hash_code(charset_t const&amp;) const]+0x19): undefined reference to `std::hash&lt;charset_t&gt;::operator()(charset_t) const'
/tmp/ccIn30PX.o: In function `std::__detail::_Hash_code_base&lt;charset_t, std::pair&lt;charset_t const, char const*&gt;, std::_Select1st&lt;std::pair&lt;charset_t const, char const*&gt; &gt;, std::equal_to&lt;charset_t&gt;, std::hash&lt;charset_t&gt;, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false&gt;::_M_bucket_index(std::__detail::_Hash_node&lt;std::pair&lt;charset_t const, char const*&gt;, false&gt; const*, unsigned int) const':
EncodeString.cpp:(.text._ZNKSt8__detail15_Hash_code_baseI9charset_tSt4pairIKS1_PKcESt10_Select1stIS6_ESt8equal_toIS1_ESt4hashIS1_ENS_18_Mod_range_hashingENS_20_Default_ranged_hashELb0EE15_M_bucket_indexEPKNS_10_Hash_nodeIS6_Lb0EEEj[std::__detail::_Hash_code_base&lt;charset_t, std::pair&lt;charset_t const, char const*&gt;, std::_Select1st&lt;std::pair&lt;charset_t const, char const*&gt; &gt;, std::equal_to&lt;charset_t&gt;, std::hash&lt;charset_t&gt;, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false&gt;::_M_bucket_index(std::__detail::_Hash_node&lt;std::pair&lt;charset_t const, char const*&gt;, false&gt; const*, unsigned int) const]+0x28): undefined reference to `std::hash&lt;charset_t&gt;::operator()(charset_t) const'
collect2: ld はステータス 1 で終了しました
murachi@ubuntu-vbox:~/otoco/trunk/sample$ 
</pre>
<h3>解決策</h3>
<p>ヘッダーファイルの方で、以下の記述を列挙型の定義のすぐ後辺りに追加してやることで、リンクも通るようになります。テンプレートの特殊化ってやつですね。</p>
<pre>
namespace std {
template &lt;&gt;
    inline size_t
    hash&lt;charset_t&gt;::operator()(charset_t val) const
{
    return static_cast&lt;size_t&gt;(val);
}
}
</pre>
<h3>解説</h3>
<p><code>std::hash</code> テンプレートクラスの実装は、 libstdc++ の場合、ヘッダファイルが置かれる然るべきディレクトリ配下の <code>bits/functional_hash.h</code> に記述されています。ここでは、非ポインタ型 <code>T</code> に対する <code>operator()</code> は (宣言はされているものの) 定義されていません。</p>
<pre>
  /// Primary class template hash.
  template&lt;typename _Tp&gt;
    struct hash : public __hash_base&lt;size_t, _Tp&gt;
    {
      size_t
      operator()(_Tp __val) const;
    };

  /// Partial specializations for pointer types.
  template&lt;typename _Tp&gt;
    struct hash&lt;_Tp*&gt; : public __hash_base&lt;size_t, _Tp*&gt;
    {
      size_t
      operator()(_Tp* __p) const
      { return reinterpret_cast&lt;size_t&gt;(__p); }
    };
</pre>
<p>で、この <code>operator()</code> の実装は、ごくごく基本的な組み込み型に対してのみ特殊化されています (ここは流石に長くなるので引用しませんが…)。</p>
<p>こうした実装は C++11 の<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf" title="[PDF]JTC1.22.32 - ISO/IEC 14882 - Programming language C++ draft February 2011">ドラフト</a>にも明記されている標準の仕様に則ったものです。「20.8.12 Class template hash」に以下のような記述があります。</p>
<blockquote cite="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf" title="[PDF]JTC1.22.32 - ISO/IEC 14882 - Programming language C++ draft February 2011">
<ol>
<li>The unordered associative containers defined in 23.5 use specializations of the class template hash as the default hash function. For all object types Key for which there exists a specialization hash&lt;Key&gt;, the instantiation hash&lt;Key&gt; shall:
<ul>
<li>satisfy the Hash requirements (17.6.3.4), with Key as the function call argument type, the DefaultConstructible requirements (Table 19), the CopyAssignable requirements (Table 23),</li>
<li>be swappable (17.6.3.2) for lvalues,</li>
<li>provide two nested types result_type and argument_type which shall be synonyms for size_t and Key, respectively,</li>
<li>satisfy the requirement that if k1 == k2 is true, h(k1) == h(k2) is also true, where h is an object of type hash&lt;Key&gt; and k1 and k2 are objects of type Key.</li>
</ul>
<pre>
template &lt;&gt; struct hash&lt;bool&gt;;
template &lt;&gt; struct hash&lt;char&gt;;
template &lt;&gt; struct hash&lt;signed char&gt;;
template &lt;&gt; struct hash&lt;unsigned char&gt;;
template &lt;&gt; struct hash&lt;char16_t&gt;;
template &lt;&gt; struct hash&lt;char32_t&gt;;
template &lt;&gt; struct hash&lt;wchar_t&gt;;
template &lt;&gt; struct hash&lt;short&gt;;
template &lt;&gt; struct hash&lt;unsigned short&gt;;
template &lt;&gt; struct hash&lt;int&gt;;
template &lt;&gt; struct hash&lt;unsigned int&gt;;
template &lt;&gt; struct hash&lt;long&gt;;
template &lt;&gt; struct hash&lt;unsigned long&gt;;
template &lt;&gt; struct hash&lt;long long&gt;;
template &lt;&gt; struct hash&lt;unsigned long long&gt;;
template &lt;&gt; struct hash&lt;float&gt;;
template &lt;&gt; struct hash&lt;double&gt;;
template &lt;&gt; struct hash&lt;long double&gt;;
template &lt;class T&gt; struct hash&lt;T*&gt;;
</pre>
</li>
</ol>
</blockquote>
<p>そんな訳で、デフォルトで <code>std::hash</code> を利用する <code>std::unordered_map</code> を <code>enum</code> 型をキーにして使用したい場合には、その <code>enum</code> 型で <code>std::hash::operator()</code> を特殊化してあげる必要があるのです。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2012/01/02/stl-enum-hash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++11 で Unicode プログラミングのススメ</title>
		<link>https://blog.harapeko.jp/2011/12/27/cpp11-unicode/</link>
		<comments>https://blog.harapeko.jp/2011/12/27/cpp11-unicode/#comments</comments>
		<pubDate>Mon, 26 Dec 2011 16:33:41 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++0x]]></category>
		<category><![CDATA[C++11]]></category>
		<category><![CDATA[Unicode]]></category>
		<category><![CDATA[wchar_t]]></category>
		<category><![CDATA[文字セット]]></category>
		<category><![CDATA[文字列処理]]></category>
		<category><![CDATA[正規表現]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=229</guid>
		<description><![CDATA[このエントリは、C++11 Advent Calendar 2011 への参加記事です。 初心者表明を免罪符に [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>このエントリは、<a href="http://atnd.org/events/21936">C++11 Advent Calendar 2011</a> への参加記事です。</p>
<p>初心者表明を免罪符にするつもりは毛頭無いのですが、 C++0x/11 の学習、およびそれを用いた経験はまだまだ浅いため、内容的に拙い部分が多々あることを、あらかじめご容赦願いたいと思います <tt>m(_ _)m</tt> 。ていうか突っ込みだいかんげいでつ。</p>
<p>一応 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf">ISO/IEC 14882:2011 の draft &#8220;n3242&#8243;</a> を参照しています。 GCC は 4.7 入れるの面倒だったので、動作確認できるものについては Ubuntu 11.10 に入っていた 4.6.1 を用いています。</p>
<h3>Unicode に対応したリテラル</h3>
<p>文字リテラルについてはドラフトの 2.14.3、文字列リテラルについては 2.14.5 に記述があります。<br />
<span id="more-229"></span><br />
文字リテラルには従来の</p>
<pre>
'a'
L'あ'
</pre>
<p>といったスタイルに加えて、</p>
<pre>
u'\u00a9'   // コピーライト記号
U'\U0002000b'  // 丈の右上に点がついた字
</pre>
<p>といったスタイルが追加されました。想定されるべき対応関係を表にすると以下の通りになります。</p>
<table>
<tr>
<th>記述スタイル</th>
<th>文字セット</th>
<th>物理型</th>
</tr>
<tr>
<td><code>'</code>&#8230;<code>'</code></td>
<td>所謂 C 文字。<br />マルチバイトの 1 オクテットでもいいし、まぁ、何でもあり。</td>
<td><code>char</code></td>
</tr>
<tr>
<td><code>l'</code>&#8230;<code>'</code> または <code>L'</code>&#8230;<code>'</code></td>
<td>ユニバーサル文字セット (UCS)。</td>
<td><code>wchar_t</code></td>
</tr>
<tr>
<td><code>u'</code>&#8230;<code>'</code></td>
<td>UTF-16</td>
<td><code>char16_t</code></td>
</tr>
<tr>
<td><code>U'</code>&#8230;<code>'</code></td>
<td>UTF-32</td>
<td><code>char32_t</code></td>
</tr>
</table>
<p>文字列リテラルではさらに <code>u8</code> という接頭子も使えます。</p>
<pre>
u8"Copyright \u00a9 2011 Harapeko, Inc."    // \u00a9 は UTF-8 のオクテット列 [C2 A9] に変換される
u"\U0002000bは「丈」の字にクリソツ"         // \U0002000b は UTF-16 の該当するサロゲートペアに変換される…ハズ
</pre>
<p>対応関係の表は、…面倒くさいからもういいか。</p>
<p>あとさらっと流しちゃいましたが、 Unicode 用のエスケープ文字も追加されました。<q><code>\uNNNN</code></q> は 16bits の、 <q><code>\UNNNNNNNN</code></q> は 32bits の UCS を表現できます。上記の例のように、適切な文字列リテラル内で使用すれば、対応する文字セットの数値列に適宜変換されるはずです。この辺の説明はドラフトの 2.3 にありますが、以下の説明の通り、あくまで UCS の文字値を表現するものであって UTF の数値列を表現するものではないので、 <code>\uNNNN</code> の形式でサロゲートペアの上位代用符号位置に相当する値を指定することはできません。</p>
<blockquote cite="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf" title="Working Draft, Standard for Programming<br />
Language C++ (N3242=11-0012)"><p>
The character designated by the universal-character-name \UNNNNNNNN is that character whose character<br />
short name in ISO/IEC 10646 is NNNNNNNN; the character designated by the universal-character-name \uNNNN<br />
is that character whose character short name in ISO/IEC 10646 is 0000NNNN. If the hexadecimal value for a<br />
universal-character-name corresponds to a surrogate code point (in the range 0xD800.0xDFFF, inclusive),<br />
the program is ill-formed. Additionally, if the hexadecimal value for a universal-character-name outside the<br />
c-char-sequence, s-char-sequence, or r-char-sequence of a character or string literal corresponds to a control<br />
character (in either of the ranges 0&#215;00.0x1F or 0x7F.0x9F, both inclusive) or to a character in the basic<br />
source character set, the program is ill-formed.15
</p></blockquote>
<h3>Unicode に対応した物理型</h3>
<p>Unicode に対応した型については、ドラフトの 3.9.1 に説明があります。重要なのは多分以下の箇所。</p>
<blockquote cite="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf" title="Working Draft, Standard for Programming<br />
Language C++ (N3242=11-0012)">
<ol start="5">
<li>Type wchar_t is a distinct type whose values can represent distinct codes for all members of the largest<br />
extended character set specified among the supported locales (22.3.1). Type wchar_t shall have the same<br />
size, signedness, and alignment requirements (3.11) as one of the other integral types, called its underlying<br />
type. Types char16_t and char32_t denote distinct types with the same size, signedness, and alignment as<br />
uint_least16_t and uint_least32_t, respectively, in &lt;stdint.h&gt;, called the underlying types.</li>
</ol>
</blockquote>
<p>エーゴは苦手なんですが、ここを読む限り、<code>wchar_t</code> はサポートするロケールに含まれるもっとも大きな値の文字値を表現できるのに十分なサイズの整数型であることが補償されてなきゃいけなさそうに見えます。 <code>wchar_t</code> については<a href="http://blog.harapeko.jp/2009/07/25/wchar_t-suck/" title="はらぺこ日誌? ブログアーカイブ ? 頼りなさげな wchar_t">大分昔に見捨てている</a>んですが <tt>(^_^;</tt> 、VC++2010 だと 32bits 整数に変更されていたりするんでしょうか…?</p>
<p># <a href="http://msdn.microsoft.com/ja-jp/library/s3f49ktz.aspx" title="Data Type Ranges (MSDN)">この辺</a>とか見る限り、やっぱり <code>unsigned short int</code> 相当、のままみたいですね… orz</p>
<p><code>char16_t</code> と <code>char32_t</code> は、それぞれ UTF-16、 UTF-32 を扱うための型と考えて差し支えなさそうです。</p>
<h3>「内部文字」のポリシー</h3>
<p>型についての想定を考えるならば、プログラムが内部で扱う文字データは、 C++11 では <code>wchar_t</code> を使用するべきであるように思われます。将来的にはそうなってゆくべきなのでしょう。しかし過去との互換性などの観点から、各ベンダーの <code>wchar_t</code> に対する取り扱いは当面現状維持か、もしくは段階的な仕様変更 (コンパイラオプションでの切り替え等) となっていくことが予想されます。</p>
<p>それに対し、 UTF-32 に関して言えば、恐らく向こう十何年かぐらいは「1要素 = UCS 1文字」であり続けるのではないかと思われます。従って、内部文字への要件として「1文字を 1つの数値のみで扱いたい」というのがあるのであれば、当面は <code>char32_t</code> と <code>U"</code>&#8230;<code>"</code> 形式のリテラルを用いるのが良さそうです。</p>
<table>
<tr>
<th>要件</th>
<th>選択すべき型と文字セット</th>
</tr>
<tr>
<td>
<ul>
<li>1文字を 1つの数値のみで扱いたい</li>
<li>メモリー使用量は気にしないか、32bits 幅でも十分管理可能</li>
</ul>
</td>
<td><code>char32_t</code>、 UTF-32</td>
</tr>
<tr>
<td>
<ul>
<li><code>&lt;</code>(<code>boost/</code>)<code>regex&gt;</code> を使いたい (後述)</li>
<li>UTF-8 のクセに精通しているのでマルチバイトでも気にならない</li>
<li>メモリー使用量を極力抑えたい</li>
</ul>
</td>
<td><code>char</code>、 UTF-8</td>
</tr>
<tr>
<td>
<ul>
<li>とにかく <code>wchar_t</code> を使い慣れている</li>
<li>数十年後の未来との互換性、汎用性に賭けたい</li>
</ul>
</td>
<td><code>wchar_t</code>、 UCS</td>
</tr>
</table>
<h3>char32_t で文字列置換を試してみる</h3>
<p>そんなわけで、実際に UTF-32 を内部文字の文字セットとして採用したプログラム例を作ってみることにしました。内容的には、静的に用意した文字列内のすべての「くま」を「ぱんだ」に置き換える、という簡単なものです。</p>
<pre>
#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;string&gt;

using namespace std;

int main()
{
    u32string before = U&quot;てくまくまやこんてくまくまやこん むらやましゃちょうよ おおきなくまにな～ぁれ&quot;;
    u32string after;
    u32string kuma = U&quot;くま&quot;;
    u32string panda = U&quot;ぱんだ&quot;;

    auto start_it = before.begin();
    auto find_it = start_it + (kuma.size() - 1);
    while (find_it &lt; before.end()) {
        int cnt = 0;
        auto stop_it = find_if(kuma.rbegin(), kuma.rend(), [&amp;cnt, find_it](char32_t letter) {
            return *(find_it - cnt++) != letter;
        });
        if (stop_it != kuma.rend()) {
            find_it += cnt;
            continue;
        }
        // くまを発見、ぱんだに変身!!
        after.append(start_it, find_it - (kuma.size() - 1));
        after += panda;
        start_it = find_it + 1;
        find_it = start_it + (kuma.size() - 1);
    }
    after.append(start_it, find_it);

    cout &lt;&lt; &quot;before: &quot; &lt;&lt; before.size() &lt;&lt; endl;
    cout &lt;&lt; &quot;after: &quot; &lt;&lt; after.size() &lt;&lt; endl;

    return 0;
}
</pre>
<p>えっと… アルゴリズムの説明とかはいいですよね? 文字列の先頭からと検索語の後からで評価して、完全一致しなかった場合は一致した数値の数だけ読み飛ばして、を繰り返すというオーソドックスなやり方です。これだったらかっこつけて <code>find_if</code> とか使わんで <code>for</code> で回しても大して変わらんやんとかそういう突っ込みはさておき <tt>(^_^;</tt> 。</p>
<p>GCC4.6/Ubuntu での実行結果は以下の通り。</p>
<pre>
murachi@ubuntu-vbox:~/otoco/trunk/sample$ g++ -std=c++0x -o kumapan-n kumapan-n.cpp 
murachi@ubuntu-vbox:~/otoco/trunk/sample$ ./kumapan-n
before: 39
after: 44
murachi@ubuntu-vbox:~/otoco/trunk/sample$ 
</pre>
<p>実行結果として置換前後の <code>u32string::size()</code> を表示しています。 5つある「くま」が「ぱんだ」に置き換えられたので、その数が 5 増えています。増える筈の文字数と一致するので、正しく動作しているように見えます。</p>
<h3>iconv を使って実際に出力してみる</h3>
<p>さて、実際の文字列を出力してみたいのですが、このままだとロケールが UTF-8 で動作している端末上では表示できません。ファイルに出力してテキストエディタで、という手もありますが、せっかくなので libiconv を使って指定した文字セットに変換して出力、ということをやってみることにしましょう。</p>
<p>libiconv の利用に際しては、お手製のラッパークラスを作成することで対応しました。作成したソースコードを以下にリンクします。</p>
<ul>
<li><a href="http://developer.harapeko.jp/trac/original/otoco/browser/trunk/sample/EncodeString.hpp?rev=16">EncodeString.hpp</a></li>
<li><a href="http://developer.harapeko.jp/trac/original/otoco/browser/trunk/sample/EncodeString.cpp?rev=16">EncodeString.cpp</a></li>
</ul>
<p>このクラスは<a href="http://blog.harapeko.jp/2010/09/22/utf-8-is-nice/" title="はらぺこ日誌? ブログアーカイブ ? UTF-8 もイマイチだが…">過去の記事</a>においても使用しておりますが、 C++11 の勉強も兼ねて (?)、内部文字に使用する物理型と文字セットをテンプレートパラメータに指定できるテンプレートクラスに書き換えています (あ、過去の記事でのソースへのリンク先が最新版になっちゃってる…直さなきゃ…)。</p>
<p>そして先ほどのサンプルプログラムは、最初の方で <code>EncodeString.hpp</code> を <code>#include</code> し、</p>
<pre>
#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;string&gt;

#include &quot;EncodeString.hpp&quot; // ←

using namespace std;
</pre>
<p>最後の方で出力内容を以下のように修正します。</p>
<pre>
    cout &lt;&lt; &quot;before: &quot; &lt;&lt; EncodeString&lt;char32_t, chset_Utf32&gt;(before, chset_Utf8).getCharArray() &lt;&lt; endl;
    cout &lt;&lt; &quot;after: &quot; &lt;&lt; EncodeString&lt;char32_t, chset_Utf32&gt;(after, chset_Utf8).getCharArray() &lt;&lt; endl;
</pre>
<p>Windows 環境とかで Shift JIS (CP-932) で出力したい人は、 <code>chset_Utf8</code> を <code>chset_Cp932</code> に置き換えてあげれば ok です。GCC4.6/Ubuntu での実行結果は以下の通り。</p>
<pre>
murachi@ubuntu-vbox:~/otoco/trunk/sample$ g++ -std=c++0x -o kumapan EncodeString.cpp kumapan.cpp 
murachi@ubuntu-vbox:~/otoco/trunk/sample$ ./kumapan
before: てくまくまやこんてくまくまやこん むらやましゃちょうよ おおきなくまにな～ぁれ
after: てぱんだぱんだやこんてぱんだぱんだやこん むらやましゃちょうよ おおきなぱんだにな～ぁれ
murachi@ubuntu-vbox:~/otoco/trunk/sample$ 
</pre>
<p>環境によっては libiconv を別途導入してコンパイルオプションに <code>-liconv</code> を付け加える必要があるかもしれません (MinGW とか←動作未確認)。</p>
<h3>正規表現を使いたい</h3>
<p>さて、上記のサンプルでさらっと <code>u32string</code> とか使っちゃってますが、このシノニムはドラフトの 21.3 にてちゃんと明記された標準のものです。もちろん、 <code>u16string</code> というのも存在します (<code>u8string</code> は無いので、考慮されているのはアラインメントのみと考えるべきですが…)。</p>
<p>しかし、「28 Regular expressions library」の章においては、 <code>char32_t</code> という文字はカケラも hit しません。標準の <code>&lt;regex&gt;</code> においては、 <code>char16_t</code>、 <code>char32_t</code> への対応は見送られてしまっているようです。</p>
<p>もちろん、<code>basic_regex</code> はテンプレートクラスなのですから、自分でテンプレートパラメータを指定してあげればうまくいきそうに見えます。しかし、<a href="http://blog.harapeko.jp/2010/09/22/u32regex-bad-cast/" title="はらぺこ日誌? ブログアーカイブ ? char32_t だと regex が使えない">同様の試みを Boost.Regex について行った際には、 <code>std::bad_cast</code> 例外が送出されてプログラムがエラー終了してしまいました</a>。将来的には、あるいは処理系によってはうまく動かせる (ようになる) のかもしれませんが、あまり期待は持たない方が良いかもしれません…。</p>
<p># そもそも <a href="http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x" title="C++ 200x - Chapter 1. Status (libstdc++)">GCC (libstdc++) では <code>&lt;regex&gt;</code> 自体がまだちゃんと実装されてなかったり</a>… orz</p>
<p>もっとも、<a href="http://blog.harapeko.jp/2011/09/21/boostregex-icu-with-char32_t/" title="はらぺこ日誌? ブログアーカイブ ? Boost.Regex の ICU 拡張と char32_t は相性がいいかも?">Boost.Regex の ICU 拡張における <code>UChar32</code> と <code>char32_t</code> (およびそれらの配列へのポインタ) を無理矢理キャストして使うと割と上手く行くっぽかったりする</a>ので、どうにかこうにかラッパーを書いて当座はそれで凌ぐというのも手かもしれません…。</p>
<p>ちなみに、<code>char</code> と UTF-8 を使用するのであれば <code>&lt;regex&gt;</code> はそのまま使えるはずですが、その場合、 (Boost.Regex と同様に) <a href="http://blog.harapeko.jp/2010/09/22/utf-8-is-nice/" title="はらぺこ日誌? ブログアーカイブ ? UTF-8 もイマイチだが…"><code>&lt;regex&gt;</code> は UTF-8 を知らないので、マルチバイト特有の問題に悩まされることになる</a>でしょう。少なくとも日本語の文字に対する量指定子 (<q><code>あ+</code></q> とか <q><code>あ?</code></q> とか) は期待通りには動きません。</p>
<p>仮に、<code>&lt;regex&gt;</code> が <code>char32_t</code> で利用できる場合、先のサンプルは以下のようなコーディングになるでしょう。こういう風に組める日がいつか来るといいですね… <tt>(;_;)/</tt>。</p>
<pre>
#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;string&gt;
#include &lt;regex&gt;

#include &quot;EncodeString.hpp&quot;

using namespace std;

typedef basic_regex&lt;char32_t, regex_traits&lt;char32_t&gt;&gt; u32regex;
typedef match_results&lt;u32string::const_iterator&gt; u32smatch;


int main()
{
    u32string before = U&quot;てくまくまやこんてくまくまやこん むらやましゃちょうよ おおきなくまにな～ぁれ&quot;;
    u32string after;
    u32regex reg(U&quot;くま&quot;);
    u32smatch match;

    u32string textbuf = before;
    while (regex_search(textbuf, match, reg)) {
        after += match.prefix().str() + U&quot;ぱんだ&quot;;
        textbuf = match.suffix().str();
    }
    after += textbuf;

    cout &lt;&lt; &quot;before: &quot; &lt;&lt; EncodeString&lt;char32_t, chset_Utf32&gt;(before, chset_Utf8).getCharArray() &lt;&lt; endl;
    cout &lt;&lt; &quot;after: &quot; &lt;&lt; EncodeString&lt;char32_t, chset_Utf32&gt;(after, chset_Utf8).getCharArray() &lt;&lt; endl;

    return 0;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2011/12/27/cpp11-unicode/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Boost.Regex の ICU 拡張と char32_t は相性がいいかも?</title>
		<link>https://blog.harapeko.jp/2011/09/21/boostregex-icu-with-char32_t/</link>
		<comments>https://blog.harapeko.jp/2011/09/21/boostregex-icu-with-char32_t/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 02:27:05 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++0x]]></category>
		<category><![CDATA[Unicode]]></category>
		<category><![CDATA[文字列処理]]></category>
		<category><![CDATA[正規表現]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=205</guid>
		<description><![CDATA[なんとなく Virtual Box から利用している Ubuntu のアップグレードなどをして、そこからなんと [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>なんとなく Virtual Box から利用している Ubuntu のアップグレードなどをして、そこからなんとなく「やっぱり Long Time Release 版の Ubuntu もテスト環境に持っておきたいよなぁ」などと思いつつ Virtual Box ディスクイメージを追加でこさえて、 Boost ライブラリのセットアップなどもしつつ動作チェックも兼ねて<a href="http://blog.harapeko.jp/2010/09/22/u32regex-bad-cast/" title="はらぺこ日誌» ブログアーカイブ » char32_t だと regex が使えない">昔書いた記事</a>なんぞを掘り起こしておりましたら、そこに書かれた内容に関連して、そういえば Boost.Regex も ICU ライブラリと組み合わせれば Unicode に対応できたはずだよなぁなどということが気になりだしてしまいまして、いろいろ試しているうちに、以下のようなサンプルコードが問題なく動作してしまうことを発見してしまったのでメモしておこうかと思った次第なのであります。ああ、なんだかこちらのブログも口調が個人ブログや普段の Twitter とかでのそれに似てきてしまいました <tt>(^_^;A</tt> 。<br />
<span id="more-205"></span></p>
<pre>
#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;boost/regex.hpp&gt;
#include &lt;boost/regex/icu.hpp&gt;

using namespace std;

using boost::u32regex;
using boost::u32match;

int main()
{
        u32string text(U&quot;C++0x のせかいへようこそ!!&quot;);
        cout &lt;&lt; &quot;pre-modified text length = &quot; &lt;&lt; text.length() &lt;&lt; endl;
        u32string modified;
        u32regex reg(reinterpret_cast&lt;UChar32 const*&gt;(U&quot;せかい&quot;));
        u32match match;
        while (boost::regex_search(reinterpret_cast&lt;UChar32 const*&gt;(text.c_str()), match, reg)) {
                modified += u32string(reinterpret_cast&lt;char32_t const*&gt;(match.prefix().str().c_str())) + U&quot;世界&quot;;
                text = reinterpret_cast&lt;char32_t const*&gt;(match.suffix().str().c_str());
        }
        modified += text;
        cout &lt;&lt; &quot;modified text length = &quot; &lt;&lt; modified.length() &lt;&lt; endl;
        return 0;
}
</pre>
<p>とりあえず動作確認環境は以下の通りです。</p>
<ul>
<li>Ubuntu 11.04 + gcc 4.5.2 + Boost 1.42.0</li>
<li>Ubuntu 10.04 LTS + gcc 4.4.3 + Boost 1.40.0</li>
</ul>
<p>どちらでもコンパイルコマンドは以下で通ります (ソースファイルを <code>u32test.cpp</code> として保存した場合)。</p>
<pre>
$ g++ -std=c++0x -o u32test u32test.cpp -lboost_regex
</pre>
<p>実行してみると、置換前と置換後の文字数が正しくカウントされており、マッチングが期待通りに動作していることが確認できます。</p>
<pre>
$ ./u32test
pre-modified text length = 17
modified text length = 16
$ 
</pre>
<p>ただ、コードを見ていただければわかる通り、 <code>reinterpret_cast</code> の嵐であり、こうした書き方が C++0x 的にも Boost.Regex 的にも ICU 的にも Valid なのかはわかりません。また、現時点では Windows 環境 (MinGW + gcc 4.5 など) での動作確認は行っておりません。 ICU 拡張部分のヘッダを見る限り、内部で <code>wchar_t</code> を使っているので、 <code>wchar_t</code> が 16bits 境界になっている Windows では、バイトオーダーがひっくり返るなどの問題があって、もしかしたら正常に動かないかもしれません。</p>
<p>あくまで参考までと言いますか、将来的にはこういう感じの書き方ができるようになると良いなぁと言う程度の妄想、と捉えていただければと思います… <tt>m(_ _)m</tt></p>
<p>ちなみに、ここ最近ちっとも進んでいない otoco ですが、恐らく C++0x 自体の採用を見送る形になると思われます…。ただ、 Boost.Regex の ICU 拡張は有効利用できそうな気がしてきたので、こちらは利用することになるかもしれません。</p>
<p>Google の <a href="http://code.google.com/p/re2/">re2</a> に流れてしまいそうな悪寒もしてますが…。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2011/09/21/boostregex-icu-with-char32_t/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Boost.勉強会 #4 に行ってきました。</title>
		<link>https://blog.harapeko.jp/2011/02/26/boost%e5%8b%89%e5%bc%b7%e4%bc%9a-4-%e3%81%ab%e8%a1%8c%e3%81%a3%e3%81%a6%e3%81%8d%e3%81%be%e3%81%97%e3%81%9f%e3%80%82/</link>
		<comments>https://blog.harapeko.jp/2011/02/26/boost%e5%8b%89%e5%bc%b7%e4%bc%9a-4-%e3%81%ab%e8%a1%8c%e3%81%a3%e3%81%a6%e3%81%8d%e3%81%be%e3%81%97%e3%81%9f%e3%80%82/#comments</comments>
		<pubDate>Sat, 26 Feb 2011 11:43:20 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[活動記録]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++0x]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=154</guid>
		<description><![CDATA[Boost.勉強会 #4 : ATND 前回 今回も必死こいてメモ執りましたよ。終盤力尽きたけど orz Bo [&#8230;]]]></description>
				<content:encoded><![CDATA[<ul>
<li><a href="http://atnd.org/events/11551">Boost.勉強会 #4 : ATND</a></li>
<li><a href="http://blog.harapeko.jp/2010/09/12/boost-study/">前回</a></li>
</ul>
<p>今回も必死こいてメモ執りましたよ。終盤力尽きたけど orz</p>
<ul>
<li><a href="http://developer.harapeko.jp/trac/original/ideanote/wiki/HowTo/BoostStudy4">Boost.勉強会 #4 ノート</a></li>
</ul>
<p>しかしさすがにこの年で一日通しはキツいっすなぁ…。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2011/02/26/boost%e5%8b%89%e5%bc%b7%e4%bc%9a-4-%e3%81%ab%e8%a1%8c%e3%81%a3%e3%81%a6%e3%81%8d%e3%81%be%e3%81%97%e3%81%9f%e3%80%82/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UTF-8 もイマイチだが…</title>
		<link>https://blog.harapeko.jp/2010/09/22/utf-8-is-nice/</link>
		<comments>https://blog.harapeko.jp/2010/09/22/utf-8-is-nice/#comments</comments>
		<pubDate>Wed, 22 Sep 2010 14:55:16 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++0x]]></category>
		<category><![CDATA[otoco]]></category>
		<category><![CDATA[Unicode]]></category>
		<category><![CDATA[文字列処理]]></category>
		<category><![CDATA[正規表現]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=138</guid>
		<description><![CDATA[UTF-32 が内部文字列に使えないことがわかったので、 UTF-8 を内部文字列に使用するというルールで l [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.harapeko.jp/2010/09/22/u32regex-bad-cast/" title="はらぺこ日誌» ブログアーカイブ » char32_t だと regex が使えない">UTF-32 が内部文字列に使えないことがわかった</a>ので、 UTF-8 を内部文字列に使用するというルールで libiconv によるエンコーディング操作と Boost.Regex による正規表現の両方を同時に試すサンプルを作成してみました。</p>
<ul>
<li><a href="http://developer.harapeko.jp/trac/original/otoco/browser/trunk/sample/EncodeString.hpp">sample/EncodeString.hpp</a></li>
<li><a href="http://developer.harapeko.jp/trac/original/otoco/browser/trunk/sample/EncodeString.cpp">sample/EncodeString.cpp</a></li>
<li><a href="http://developer.harapeko.jp/trac/original/otoco/browser/trunk/sample/regex-test.cpp">sample/regex-test.cpp</a></li>
</ul>
<p>Makefile は作ってません＼(^O^)／。試してみたい人は頑張ってコンパイルしてねｗ</p>
<pre>
$ g++ -std=c++0x -o regex-test regex-test.cpp EncodeString.cpp -lboost_regex
</pre>
<p>まともな環境 (Linux + GCC4.5 とか) なら上記コマンドで通るはず。libiconv を (glibc に上書きする形で) インストールしている場合は <code>-liconv</code> を末尾に入れる必要があるかも。そして MinGW を使う場合は更にもう一工夫必要かも <tt>(((;/^^)/</tt><br />
<span id="more-138"></span><br />
さてこのプログラム、注目して頂きたいのは、<code>regex-test.cpp</code> の以下の行です。</p>
<pre>
        regex reg(u8"くま|川|(お)?魚");
</pre>
<p>正規表現を定義しているのですが、一文字でしかないはずの <code>"お"</code> がわざわざ丸括弧でくくってありますね。これが Perl で <code>use utf8;</code> していたり、 UTF-8 で JavaScript を書いていたりしているのであれば、不要な括弧です。</p>
<p>しかし、 Boost.Regex を UTF-8 で使用する場合には必要です。この括弧がなければ、 <code>"?"</code> は <code>"お"</code> の最終オクテットにしか適用されません。なぜなら、 Boost.Regex は UTF-8 なんて知らないので、 <code>"お"</code> が論理的には 1文字でしかない、なんてことは認識できないからです。</p>
<p>すなわち、</p>
<pre>
        regex reg(u8"くま|川|お?魚");
</pre>
<p>と書いてしまうと、<code>"お魚"</code> には hit しますが、 <code>"魚"</code> には hit しなくなってしまうのです。</p>
<p>otoco では、 MML コンパイラ機能において、プログラマブルマクロを定義できる機能を提供する予定です。具体的には Lua でマクロを定義し、そのマクロを用いて生成した MML をインライン展開できるようにする、といったものです (実際の所、言語に Lua を採用すべきか JavaScript を採用すべきか、はたまた Python を採用すべきかで迷っているところではあるのですが…)。</p>
<p>で、 (Lua を採用する場合には) 正規表現を用いた文字列加工を行う関数を提供するつもりでいるのですが (JavaScript とかだったら不要なんですけどね、言語機能にあるし)、仮に非 ASCII な文字 (列) を hit させようとする正規表現に <code>"?"</code> やら <code>"[</code>…<code>]"</code> やらが使われた場合、どう扱うべきなんだろう、といった辺りが悩みどころではあったりします…。</p>
<p>まぁなんにせよ、他に選択の余地もないので、とりあえず内部文字列は UTF-8 で実装するという方針でやっていくことにしようかと思います。前途多難じゃ… orz</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2010/09/22/utf-8-is-nice/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>char32_t だと regex が使えない</title>
		<link>https://blog.harapeko.jp/2010/09/22/u32regex-bad-cast/</link>
		<comments>https://blog.harapeko.jp/2010/09/22/u32regex-bad-cast/#comments</comments>
		<pubDate>Wed, 22 Sep 2010 02:21:44 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++0x]]></category>
		<category><![CDATA[GCC]]></category>
		<category><![CDATA[iconv]]></category>
		<category><![CDATA[otoco]]></category>
		<category><![CDATA[Unicode]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=133</guid>
		<description><![CDATA[C++0x では UCS に対応し、専用の型やリテラルの記法が導入されました。その関係で、以下の点について調査 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>C++0x では UCS に対応し、<a href="http://ja.wikipedia.org/wiki/C%2B%2B0x#.E6.96.B0.E3.81.9F.E3.81.AA.E6.96.87.E5.AD.97.E5.88.97.E3.83.AA.E3.83.86.E3.83.A9.E3.83.AB" title="新たな文字列リテラル - C++0x - Wikipedia">専用の型やリテラルの記法が導入されました</a>。その関係で、以下の点について調査を行っていました。</p>
<ol>
<li>C++0x で UCS を UTF-32 として扱う型 <code>char32_t</code>, <code>u32string</code> およびリテラル <code>U"..."</code> と、 libiconv の UCS-4-INTERNAL との間に互換性はあるか。</li>
<li>C++0x で新たに追加された正規表現ライブラリ <code>&lt;regex&gt;</code> は利用可能か。</li>
<li><code>&lt;regex&gt;</code> が利用できない場合、 Boost.Regex を用いて UTF-32 文字列を処理することは可能か。</li>
</ol>
<p>これらの調査は、すべて otoco のコアデータを扱うプログラム内で内部文字列に UTF-32 を採用することを前提としたものでした。<br />
<span id="more-133"></span><br />
結論から言うと、<strong>内部文字列に UTF-32 を採用することは、現時点では諦めざるを得ない、ということになりました。＼(^O^)／</strong> 以下、その解説です。</p>
<p>1 については、互換性に問題がないことを確認しました。</p>
<p>2 についてですが、 GCC 4.5 の標準 C++ ライブラリでは、 <code>&lt;regex&gt;</code> のヘッダファイルは存在するものの、ライブラリの実体がまだ用意されていない、という状態のようでした。</p>
<p>で、 3 についてなのですが… 簡単のため、以下のサンプルを見てみることにします。</p>
<pre>
#include &lt;string&gt;
#include &lt;boost/regex.hpp&gt;

using namespace std;

typedef boost::basic_regex&lt;char32_t, boost::regex_traits&lt;char32_t&gt; &gt; u32regex;
typedef boost::match_results&lt;u32string::const_iterator&gt; u32smatch;

int main()
{
	u32string text(U&quot;C++0x のせかいへようこそ!!&quot;);
	u32string modified;
	u32regex reg(U&quot;せかい&quot;);
	u32smatch match;
	while (boost::regex_search(text, match, reg)) {
		modified += match.prefix().str() + U&quot;世界&quot;;
		text = match.suffix().str();
	}
	modified += text;
	return 0;
}
</pre>
<p>このサンプルは、期待通りに動作しても、何もしません。UTF-32 の文字列 <code>U"C++0x のせかいへようこそ!!"</code> の <code>U"せかい"</code> を <code>U"世界"</code> に置換する、という処理を内部で行うだけです。 <code>u32string</code> に対応した <code>iostream</code> があったとして、 UTF-32 をそのままコンソールやファイルに出しても不親切なだけなので、出力までやるなら libiconv と組み合わせるべきですが、プログラムが複雑になるので、ここではそこまで示していません (実際にはそこまで試そうとしていたのですが…)。</p>
<p>で、このプログラム、実際はどうなるのかというと、 GCC 4.5 でコンパイルは通るものの、実行すると、 <strong><code>u32regex</code> オブジェクト</strong> (これは <code>boost::basic_regex&lt;char32_t, boost::regex_traits&lt;char32_t&gt; &gt;</code> のシノニムですね) <strong>のコンストラクタが <code>std::bad_cast</code> 例外を送出します</strong>。どうやら、 Boost.Regex は <code>char32_t</code>、すなわち 32bits 以上の整数型を文字コードに使用するということ、を想定した作りにはなっていなかったようなのです。よーするに <code>char</code> と <code>wchar_t</code> しか想定していなかったんですね (ん? でも <a href="http://blog.harapeko.jp/2009/07/25/wchar_t-suck/" title="はらぺこ日誌» ブログアーカイブ » 頼りなさげな wchar_t">GCC の <code>wchar_t</code> は <code>uint32_t</code></a> だったような…)。</p>
<p>GCC の標準 C++ ライブラリが <code>&lt;regex&gt;</code> のライブラリを実装するのを悠長に待っても居られないので、方針を転換し、内部文字列は UTF-8 で実装せざるを得なさそうです。一応、UTF-8 は文字の先頭オクテットか否かを判断するのが容易なので (0&#215;80≦n≦0xBF 以外なら先頭オクテット)、文字境界の特定も文字数カウントも一度関数を書いてしまえば ok なのですが…。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2010/09/22/u32regex-bad-cast/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Boost.勉強会 #2 に参加しました。</title>
		<link>https://blog.harapeko.jp/2010/09/12/boost-study/</link>
		<comments>https://blog.harapeko.jp/2010/09/12/boost-study/#comments</comments>
		<pubDate>Sun, 12 Sep 2010 03:47:18 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[活動記録]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++0x]]></category>
		<category><![CDATA[講習会]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=130</guid>
		<description><![CDATA[Boost.勉強会 #2 : ATND 実に楽しいイベントでした。 5時間ほぼぶっ通しだったのでさすがにくたび [&#8230;]]]></description>
				<content:encoded><![CDATA[<ul>
<li><a href="http://atnd.org/events/7148">Boost.勉強会 #2 : ATND</a></li>
</ul>
<p>実に楽しいイベントでした。 5時間ほぼぶっ通しだったのでさすがにくたびれましたが… (^_^;A</p>
<p><a href="http://developer.harapeko.jp/trac/original/ideanote/wiki/HowTo/BoostStudy2" title="Boost.勉強会 #2 ノート – Idea note">自分なりにメモしたノートを公開しています</a>ので、よかったら復習にご活用ください。かなり荒いメモですが…。<br />
<span id="more-130"></span><br />
そういえば sexyhook2 の話で Win32 API をフックするのに DLL を読み込んだプログラム領域を直接書き換えているんだけどそれって大丈夫なんだっけ? という話題が出て、昔、 3D CAD モックアップツールのプロセスを生成してからデバッグアタッチし、そのプロセスが読み込んでいる <a href="http://msdn.microsoft.com/en-us/library/dd369060%28v=VS.85%29.aspx">SwapBuffers()</a> API や <a href="http://msdn.microsoft.com/en-us/library/dd374391%28v=VS.85%29.aspx">wglSwapLayerBuffers()</a> API の先頭アドレスをブレークポイント命令に置き換えて、 <a href="http://msdn.microsoft.com/ja-jp/library/cc429065.aspx">WaitForDebugEvent()</a> API がブレークポイントを拾ってくる時間あたりの回数をカウントすることで、そのモックアップツールの 3D 処理をベンチマークするツールを (仕事で!) 作ったことがあるおいらとしては、そのときは「まぁ、大丈夫なんでねぇの?」とか思いつつ特に何もコメントしなかったのですが、後になってなんとなーく、そういえば<strong>その辺の扱いって NT 系と 9x 系とでは違ってたよーな</strong>…とか思い返したりしたわけですが、はっきり言ってうろ覚えなのでなんとも言えんのです。一応調べて rti さんに伝えておいた方がいいかな…そもそも 9x 系に対応するのかどうかは別として。</p>
<p>しかしこの手の講習会は当方初参戦だったのですが、とても刺激になります。周り若い人ばっかりだし…。今後もいろいろと参加したいです。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2010/09/12/boost-study/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MinGW に GCC 4.4.0 を導入する</title>
		<link>https://blog.harapeko.jp/2010/08/31/mingw-gcc44/</link>
		<comments>https://blog.harapeko.jp/2010/08/31/mingw-gcc44/#comments</comments>
		<pubDate>Mon, 30 Aug 2010 23:17:13 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++0x]]></category>
		<category><![CDATA[GCC]]></category>
		<category><![CDATA[MinGW]]></category>
		<category><![CDATA[otoco]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=115</guid>
		<description><![CDATA[otoco のコアデータの仕様がだいぶ形になってきたので、いよいよ実装を開始しました。本当はメインマシンに L [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>otoco の<a href="http://developer.harapeko.jp/trac/original/otoco/wiki/%E5%A4%96%E9%83%A8%E4%BB%95%E6%A7%98/%E3%82%B3%E3%82%A2%E3%83%87%E3%83%BC%E3%82%BF">コアデータの仕様</a>がだいぶ形になってきたので、いよいよ<a href="http://developer.harapeko.jp/trac/original/otoco/ticket/6" title="#6 (コアデータクラスを実装する) – otoco">実装を開始しました</a>。本当はメインマシンに Linux 環境を整え直してそっちで開発を進めたいのですが、現状お金をもらってメインでやらせて頂いている仕事が Windows 環境での開発なので、並行して作業を行いやすいよう、 Windows 向けのバイナリを生成する環境として検討している <a href="http://www.mingw.org/">MinGW</a> を導入し、とりあえずはこちらで開発を進めてみることにしました。<br />
<span id="more-115"></span><br />
まだビルドが通る状態ですらないので、とりあえずミニマムケースでテストコードを書きながら、手探り状態で実装を進めているのですが、はて、 <code>int32_t</code> などの型の <code>typedef</code> が定義されている <code>stdint.h</code> の C++ 版である <code>&lt;cstdint&gt;</code> を使う場合、これらの型名は <code>std::int32_t</code> になるのやら、それとも <code>::int32_t</code> になるのやら、どっちだったかなぁと思い、テストプログラムに</p>
<pre>
#include &lt;cstdint&gt;
</pre>
<p>と書いてみたものの、これがさっぱり通らない。おおそうか、そもそも <code>&lt;cstdint&gt;</code> なんて存在しないのか、などと Twitter で<a href="http://twitter.com/T_MURACHI/status/22237400924" title="Twitter / T.MURACHI: うは、 cstdint って存在しないのか。(←超初 ...">つぶやいてみました</a>ところ、ご親切な方から VC10 (<a href="http://www.microsoft.com/japan/visualstudio/" title="Microsoft Visual Studio 2010 - Visual Studio 2010 オフィシャル サイト">Visual Studio 2010</a> の C/C++ コンパイラのことですね) にはありますよ、との<a href="http://twitter.com/cpp_akira/statuses/22237455915" title="Twitter / Faith and Brave: VC10にはありますね。 RT @T_MURACHI ...">お返事</a>が。</p>
<p>さらにもう一つ気がかりなことに、 hashmap 的なものってもう標準化されていなかったかなぁと思いつつ調べてみたところ、 C++0x であれば <code>std::unordered_map</code> が使えると言うことが分かったので、早速これも試してみようとテストプログラムに</p>
<pre>
#include &lt;unordered_map&gt;
</pre>
<p>と書いてみたところ、やっぱりこれもさっぱり通らない。で、どちらも MinGW のインストールディレクトリ以下にヘッダファイルが存在するのか検索してみると、なるほど確かにファイル自体が存在しない。</p>
<p>そもそも GCC は C++0x に対応しているのか? と調べてみると、軽くぐぐってみた限りでもバージョン 4.4 および 4.5 で C++0x への対応を改善したとのニュース記事が見つかるので、おそらくは 4.x 系であれば対応を進めてはいるんだろうなぁと言うことは伺えるわけです。</p>
<p>MinGW は割と最近導入したので、まさか古い GCC が採用されているなどとは疑いもしていなかったのですが、ここで念のためにとバージョンを確かめてみると、なんと<strong>デフォルトでインストールされている GCC のバージョンは 3.4.5</strong> だというじゃないですか。</p>
<p>まさか MinGW 版の GCC が 3.4.5 で開発が止まっているなどとはさすがに思えなかったので、早速 4.x 系にバージョンアップする方法はないかと調べてみたところ、なんのことはない、 MinGW の<a href="http://sourceforge.net/projects/mingw/files/" title="Browse MinGW - Minimalist GNU for Windows Files on SourceForge.net">ダウンロードサイト</a>に普通に用意されていて、それを展開して上書きインストールすれば済む話だったのでした (やり方の詳細は<a href="http://developer.harapeko.jp/trac/original/otoco/wiki/%E6%8A%80%E8%A1%93%E3%83%A1%E3%83%A2/MinGW%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97" title="技術メモ/MinGWセットアップ – otoco">技術メモ</a>をご参照のこと)。</p>
<p>これでいよいよ <code>&lt;cstdint&gt;</code> も <code>&lt;unordered_map&gt;</code> も使える! ということで、早速以下のようなテストプログラムを書いてみました。</p>
<pre>
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;unordered_map&gt;
#include &lt;cstdint&gt;

int main()
{
	std::unordered_map&lt;std::string, std::string&gt; murachi;
	murachi[&quot;name&quot;] = &quot;Toshiyuki Murayama&quot;;
	murachi[&quot;handle&quot;] = &quot;T.MURACHI&quot;;
	murachi[&quot;age&quot;] = &quot;32&quot;;
	
	std::cout &lt;&lt; &quot;I'm &quot; &lt;&lt; murachi[&quot;handle&quot;] &lt;&lt; &quot;(&quot; &lt;&lt; murachi[&quot;name&quot;] &lt;&lt; &quot;), &quot; &lt;&lt;
		murachi[&quot;age&quot;] &lt;&lt; &quot; years old.&quot; &lt;&lt; std::endl;
	
	std::int32_t hoge = 12345;
	std::cout &lt;&lt; &quot;hoge = &quot; &lt;&lt; hoge &lt;&lt; std::endl;
	
	return 0;
}
</pre>
<p>これを <code>test.cpp</code> という名前で保存し、コンパイルを試みますが…</p>
<pre>
murachi@YUMA ~
$ g++ -o test test.cpp
c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/unordered_map:35 ､ｫ､・include
､ｵ､・ｿ･ﾕ･｡･､･・・ﾂｿｽﾅ include ､ｫ､鬢ﾎﾊﾝｸ釥ｬﾍｭｱﾗ､ﾈ､ﾊ､・ﾇ､ｷ､遉ｦ:
,
                 test.cpp:3 ､ｫ､・ISO C ､ﾇ､ﾏﾌｾﾁｰ､ﾄ､ｭｲﾄﾊﾑｰ惞ﾞ･ｯ･惕ｷ､ﾞ､ｻ､・IS
O C99 ､ﾏｻﾈﾍﾑ､ｵ､・・ﾙ､ｭｻﾄ､熙ﾎ､ﾎｰ惞ﾗｵ皃ｷ､ﾞ､ｹ:
c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/c++0x_warning.h:31:2: error: #
error This file requires compiler and library support for the upcoming ISO C++ s
tandard, C++0x. This support is currently experimental, and must be enabled with
 the -std=c++0x or -std=gnu++0x compiler options.
test.cpp: In function 'int main()':
test.cpp:8: error: 'unordered_map' is not a member of 'std'
test.cpp:8: error: expected primary-expression before ',' token
test.cpp:8: error: expected primary-expression before '&gt;' token
test.cpp:8: error: 'murachi' was not declared in this scope

murachi@YUMA ~
$
</pre>
<p>なんだか文字化けしたエラーが出てきてしまいました。新しいバージョンの GCC はエラーを日本語で出してくれるのか? 何はともあれ、そのすぐ後ろに GCC のオプションに関するヒントが綴られていたので、「そうか C++0x 固有の機能を利用するには <code>-std=c++0x</code> オプションか <code>-std=gnu++0x</code> オプションのどっちかを指定してあげる必要があるんだな」と気づくことができました。</p>
<p>で、なんとなく <code>-std=c++0x</code> オプションの方がまだ標準っぽい感じがしたので、それを試してみたのですが、</p>
<pre>
murachi@YUMA ~
$ g++ -std=c++0x -o test test.cpp
In file included from c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/bits/pos
types.h:42,
                 from c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/iosfwd:4
2,
                 from c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/ios:39,
                 from c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/ostream:
40,
                 from c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/iostream
:40,
                 from test.cpp:1:
c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/cwchar:159: error: '::swprintf
' has not been declared
c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include/c++/cwchar:166: error: '::vswprint
f' has not been declared

murachi@YUMA ~
$
</pre>
<p>今度は <code>&lt;iostream&gt;</code> から巡り巡って参照されている <code>&lt;cwchar&gt;</code> の中で、存在しないシンボルが参照されようとしている、と怒られてしまいました。 <code>cwchar</code> ファイルの中も一応覗いてみましたが、これを書き換えてしまうのもよくないので、とりあえず一か八かでもう一つのオプション <code>-std=gnu++0x</code> を試してみることに。すると…</p>
<pre>
murachi@YUMA ~
$ g++ -std=gnu++0x -o test test.cpp

murachi@YUMA ~
$ ./test
I'm T.MURACHI(Toshiyuki Murayama), 32 years old.
hoge = 12345

murachi@YUMA ~
$
</pre>
<p>こんどはちゃんとコンパイルが通り、プログラムも期待したとおりに動作しました。</p>
<p>と、いうわけで、おさらいです。</p>
<ul>
<li>GCC のバージョンはちゃんと確認しよう。
<ul>
<li>特に、C++0x 固有の機能を用いるのであれば、 GCC 4.x 以降が必要になる。</li>
<li>クロスプラットフォーム対応を前提とする場合、対応予定の全ての環境で確認し、開発に用いる GCC のバージョンをプロジェクト内で決めてしまい、それを用いるよう徹底してしまった方がよいかも…。</li>
</ul>
</li>
<li>GCC で <code>&lt;unordered_map&gt;</code> などの C++0x 固有の機能を用いる場合、 <code>g++</code> コマンドにオプション <code>-std=gnu++0x</code> を付加する必要がある。
<ul>
<li>おそらく GCC 固有のオプションなので、 GCC 固有の機能を許可してしまっている可能性もある。 GCC 以外のコンパイラにも対応させたいのであれば、可搬性には特に注意する必要がある、かも知れない。</li>
</ul>
</li>
</ul>
<p>ちなみに、先ほどのサンプルプログラムは <code>&lt;unordered_map&gt;</code> と <code>&lt;cstdint&gt;</code> の両方をテストしていて、特に後者については以下のような記述で利用しているのですが、</p>
<pre>
	std::int32_t hoge = 12345;  // int32_t は std 名前空間に存在する
</pre>
<p>実際のところ、この記述は下記のように書き換えてもコンパイルは通ります。</p>
<pre>
	::int32_t hoge = 12345; // int32_t はグローバル名前空間にも存在する…!?
</pre>
<p>C++0x の仕様についてはまだちゃんと目を通していないので、どちらがより推奨されているのかは分かりません。この辺は後でちゃんと確認しておかねば…。</p>
<p>それから、そもそも C++0x には初期化リストなどの構文糖や型推論、ラムダ、Unicode 用の文字型と Unicode リテラル (UTF-32 リテラルと libiconv の UCS-4-INTERNAL って互換性あるのかなぁ…これも後で調べなきゃ…)、そしてタプルや正規表現 (<code>std::basic_regex</code>!!) などの追加ライブラリ群などなど…さまざまな機能の追加がなされているので、それらについても一通りさらうなり有用な書籍を探す (日本語の文献は…無いかなぁ…) なりしておかないとなぁとか思ったりするわけです (こうやってブログ記事にする為にちょっと <a href="http://ja.wikipedia.org/wiki/C%2B%2B0x" title="C++0x - Wikipedia">Wikipedia に目を通してみた</a>だけでもまぁいろいろと…また実装方針を考え直さないといけない部分も結構出てきてるなぁ… <tt>^_^;</tt>)。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2010/08/31/mingw-gcc44/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
