スポンサーサイト

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

タプルを展開して関数の引数として使う

以前書いたコードを晒す。std::tupleの要素を展開して関数に渡す。擬似コードで書けば次の感じ:

template<typename R, typename F, typename Tuple>
R apply_tuple(F f, Tuple args) {
    return f(std::get<0>(args), std::get<1>(args), ...);
}

使い方:

apply_tuple<void>(std::printf, std::make_tuple("hage %d\n", 3));

実装方法を言葉で説明するのは面倒なので擬似Haskellコードを見て納得してください:

apply_tuple f t = apply_impl f t 0 where
  apply_impl f t n | n == length t = f
  apply_impl f t n                 = apply_impl (f (t !! n)) t (n+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);
}

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

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

戻り値の型がメタ関数とかの結果で、そのまま書くとすごく長いことがある。

template<typename T>
typename hogehoge<typename piyopiyo<T>::result_type>::type
some_function(T const& x) {
  return typename hogehoge<typename piyopiyo<T>::result_type>::type(x); // 同じ型名を書いている
}

decltypeを使えば1回で済む。

template<typename T>
typename hogehoge<typename piyopiyo<T>::result_type>::type
some_function(T const& x) {
  return decltype(some_function(x))(x);
}

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

C++のテンプレートでBrainfuckインタプリタ

HaskellのBrainfuckインタプリタをC++のテンプレートに移植してみた。
遅延評価が上手くできず、リスト処理関数(テンプレート)に手を加えている。

続きを読む

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

プロフィール

minoki

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

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