スポンサーサイト

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

C++0xで、関数の戻り値の型を2回書かずに済む方法 その2

こんなのを書いてみた。

namespace detail {
template<typename... A>
struct unnamed_ctor_impl;
template<>
struct unnamed_ctor_impl<> {
  template<typename T>
  operator T() const {
    return T();
  }
  template<typename T, typename... B>
  static T apply(B&&... b) {
    return T(std::forward<B>(b)...);
  }
};
template<typename A0, typename... A>
struct unnamed_ctor_impl<A0, A...> {
private:
  A0&& a0;
  unnamed_ctor_impl<A...> rest;
public:
  unnamed_ctor_impl(A0&& a0, A&&... a) : a0(a0), rest(a...) {}
  template<typename T>
  operator T() const {
    return apply<T>();
  }
  template<typename T, typename... B>
  T apply(B&&... b) const {
    return rest.template apply<T>(std::forward<B>(b)..., std::forward<A0>(a0));
  }
};
} // namespace detail

template<typename... A> inline detail::unnamed_ctor_impl<A...>
unnamed_ctor(A&&... a) {
  return detail::unnamed_ctor_impl<A...>(a...);
}

使用例

template<typename T>
typename hogehoge<typename piyopiyo<T>::result_type>::type
some_function(T const& x) {
  return unnamed_ctor(x);
}
スポンサーサイト

テーマ : プログラミング | ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

minoki

Author:minoki
好きなプログラミング言語:
Haskell,Lua
GitHubアカウント
Twitter

最新記事
月別アーカイブ
カテゴリ
検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。