重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

boost/pointee.hpp を読んでいて、分からないところがあります。

...
template<class Iterator>
struct iterator_pointee
{
...
struct impl
{
template<class T>
static char test(T const&);

static char (& test(value_type&) )[2]; // ここ

static Iterator& x;
};
BOOST_STATIC_CONSTANT(bool, is_constant=sizeof(impl::test(*impl::x)) == 1);
....
};
...

この impl というクラスがどういう経緯でこういう実装になっているのかが分かりません。「ここ」と書いたところはどうして必要なのでしょうか。。。
このコードは const をつけるかどうかを判断するための条件のようですが、これで const が必要かどうかが分かるようになる仕組みまで教えていただけると助かります。

よろしくお願いします。

A 回答 (2件)

これは


・引数の型が value_type &
・返り値の型が char (&)[2]
という関数を表します. 返り値の型が若干あやしいかもしれませんが, 例えば
typedef char Array2[2];
static Array2 &test(value_type &);
と書いてあったらわかりますか?
    • good
    • 0
この回答へのお礼

最初は関数への参照の配列かと思ってしまいましたが、納得です。こういう syntax になるんですね。詳細に説明してくださって、ありがとうございました!

お礼日時:2010/11/22 01:59

const_iterator なら operator * でデリファレンスすると const 付きの型になるので, 上の template を使って test の返り値の型は char.


一方 const でない iterator だと下の test を使うことになるので返り値の型は char (&)[2]. それぞれの sizeof の値は 1 と 2 で違うので区別ができる.
下の test がないと, const でない iterator が使えないはず.
    • good
    • 0
この回答へのお礼

ありがとうございます。動作はなんとなく理解できたように思いますが、「ここ」と書いたところの syntax が理解できないので、100% とはいきません。もしよろしければ教えてください。。。

お礼日時:2010/11/21 11:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!