• 締切済み

固定長配列の参照に変換するoperator

固定長配列のラッパークラスを作っています。 以下のように固定長配列への参照に変換するoperatorを作りたいのですが、 かっこをどのようにつければいいのかわかりません。 同じ型のgetBuf関数を作ることはできました。 またtypedefを使えばできることはわかっていますが、使わない方法を知りたいです。 struct STRCONSTBUF{ char buf[2]; const char (&getBuf())[2]{ return buf; } //↓ここで構文エラー //getBufと同じ型のoperatorにしたい operator const char(&())[2]{ return buf; } }; 環境: Visual C++ 2008 Express よろしくお願いします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

あ, 一応指摘しておきますが, 「getBuf の返り値の型」は const char (&)[2] なんだけど, 変換関数の opeartor のあとにこれをおくことは構文上できない, つまり直接指定することは不可能だと思います. & や * をこの位置に書けないっぽい.

haporu
質問者

お礼

返事が遅くなりすいません。 あきらめることにしました。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

decltype も std::identity も使えないということだと, typedef を使わなければならない ということでしょう.

haporu
質問者

お礼

ありがとうございます。 typedefにせずそのまま書きたかった理由は 1 IntelliSenseの入力候補に余計なtypedefメンバを表示したくない 2 クラスビューとオブジェクトブラウザに表示される型がわかりにくい 3 エラーメッセージに表示される型がわかりにくい なのですが、以下のようにすることでとりあえず1と3だけは解決できました。 template<typename T> struct TYPE{ typedef T Type; }; struct STRCONSTBUF{ char buf[2]; operator TYPE<const char[2]>::Type&(){ return buf + 0; } };

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

そのような operator の必要があるかどうかはよくわからんのだけど, できないんじゃないでしょうか. 「一見 typedef を使っていないように見える」だけでいいなら boost::mpl::identity を使えばできますが, boost::mpl::identity は内部で typedef を使っています. また, C++0x の decltype を使えば近いことはできますが, const を付けることができないような気がします. 逆にいえば「const を付けなくていい」なら可能で, 例えば struct Foo { char buf[2]; operator decltype((buf))() { return buf; } }; とするとこの変換関数は「char (&)[2]」への変換として機能します. 残念ながら const char (&)[2] への変換はできないのですが....

haporu
質問者

お礼

ありがとうございます。 VC++2010をインストールしたので試してみたいと思います。

haporu
質問者

補足

VC++2010で試してみた所、その構文は使えませんでした。 必要性については、operator const char*()にしてしまうと、 errno_t strcpy_s<_Size>(char(& _Dest)[_Size], const char * _Source) のような関数に渡すことができなくなってしまうからです。

すると、全ての回答が全文表示されます。
  • hrsmmhr
  • ベストアンサー率36% (173/477)
回答No.1

ウル覚えなんですが… operator const char((*)()) ではないでしょうか?

haporu
質問者

お礼

ありがとうございます。 コンパイルエラーになってしまいました。

すると、全ての回答が全文表示されます。

関連するQ&A