FC2ブログ

スポンサーサイト返却値の扱い (2)

Home > ----- / スポンサー広告 > This Entry 2008-08 / NTTL > This Entry [com : 0][Tb : 0]

--------

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2008-08-29

前回、う~さんからご指摘いただいた内容や、C++のキーワードである not をうっかり使ってしまったという失態もあり、再度返却値の扱いについて考えてみました。再検討したのは次の内容です。
  1. not に変わる名称
  2. Safe boolイディオム
まずは、1.の not に変わる名称からです。う~さんからは failed が提案されました。しかし、

if (nttl::failed<A> a = A())
{
  // エラー処理
}
else
{
  a.value.func();
}

のような使い方になり、else 側では、オブジェクトの型が failed なのに有効という変な状況になります。いろいろ考えたのですが、結局、nttl::result のテンプレート引数を増やし、nttl::result<T, true> であれば正論理、nttl::result<T, false> であれば負論理にしようかと思います(正論理がデフォルト)。

次に、2.のSafe boolイディオムの適用についてですが、比較的安易な実装としては、

template <typename T, typename F = true>
struct result
{
private:
  typedef void (result<T, F>::*safe_bool)() const;
  void this_type_does_not_support_comparisons() const {}
public:
  T value;
  result(T const& arg) : value(arg) {}
  operator safe_bool() const
  {
    return ::nttl::bad(value) == F ? 0 : &result<T, F>::this_type_does_not_support_comparisons;
  }
};

といったところです。この方法だと、テンプレート引数が変わるごとに this_type_does_not_support_comparisons メンバ関数の実体が生成されてしまい、そのたびごとに 1 ~数ワードを消費します。どこか1箇所にまとめてしまうと、関係のない型のオブジェクトどうしを比較できるという問題が残ったままになります(メンバ関数の実体は共通の基底クラスにまとめて、safe_boolの型だけを派生クラスのメンバ関数へのポインタ型にするという手もありますが...)。

また、メンバ関数へのポインタは、通常のポインタと同じように1ワードで済むとは限りません。ささいといえば、ささいなことですが、同種のコードが大量に記述されることを考えると、なかなか踏み切れません。かといって、メンバ関数へのポインタではなく、通常のポインタにすると、それはそれでリスキーです。

Safe boolイディオムについては、「これで決まり!」という解決策もないので、今のところ保留にしておきます。何かよいアイデアがあればコメントください。

Comment

Post a Comment









管理者にだけ表示を許可

Trackback

http://cppemb.blog17.fc2.com/tb.php/113-5357fa34

C++と組み込み環境 | Page Top▲

New >>
TECS - TOPPERS Embedded Component System
<< old
返却値の扱い
ブログ内検索
RSSフィード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。