タグ

ブックマーク / gintenlabo.hatenablog.com (12)

  • はてなアイデアとやらを使ってみた - 野良C++erの雑記帳

    はてなには「はてなアイデア」という要望を提案する機能があると知ったので,幾つか要望を出してみました. はてなアイデア はてなアイデア 前者は C++ のシンタックスハイライトを C++11 に対応させてほしい,という要望, 後者は <code>some_function();</code> という記述を ``some_function();`` と書けるようにして欲しい,という要望です. どちらも,普段から「こんな機能があるといいな」と思っていたものなので,是非とも採用してもらいたい所. とはいえ, はてなアイデア日記 を見ると,どうやら はてなアイデアはロクに機能していないようなので, 実際に要望が通るかどうかは,あまり期待できそうにないです….

    はてなアイデアとやらを使ってみた - 野良C++erの雑記帳
  • Haskell の undefined や error が羨ましかったので, C++0x で作ってみた - 野良C++erの雑記帳

    http://ideone.com/nh39a #include <stdexcept> #include <utility> namespace proto_etude // prototype etude { // あらゆる型として評価できるが,実際に評価されると例外を投げる型 struct undefined_t { // 任意の型への変換 template< class T > operator T&&() const { throw std::logic_error( "etude::undefined must not be used!" ); } }; undefined_t const undefined = {}; // 例外を投げる関数. // throw との違いは,戻り値をあらゆる型として評価できる点 // 例外オブジェクトを指定して例外を投げる // error<

    Haskell の undefined や error が羨ましかったので, C++0x で作ってみた - 野良C++erの雑記帳
  • ラムダ式の型を取得する - 野良C++erの雑記帳

    C++0x から新たに C++ に追加された要素に、ラムダ式というものがあります。 これは、ちょっとした関数を、その場で定義して使えるようにしたもので、 #include <vector> #include <numeric> #include <iostream> int main() { std::vector<double> v = { -1, 2, 1.5, -4 }; double prod = std::accumulate( v.begin(), v.end(), 1, []( double x, double y ){ return x * y; } ); std::cout << prod << std::endl; // 12 } のように使います。具体的には Faith and Brave のラムダ式解説などを参照してください。 さて、そんな便利なラムダ式ですが、その

    ラムダ式の型を取得する - 野良C++erの雑記帳
    tyru
    tyru 2011/02/21
    「いったん auto で変数に束縛してから decltype する」「テンプレートによって型推論させる」
  • C++0x 標準ライブラリ完全解説 まとめ - 野良C++erの雑記帳

    No.00 Introduction (2011-01-07 更新) No.01 namespace rel_ops, utility (2011-01-07 更新) No.02 std::move, utiliy (2011-01-16 更新) No.03 std::move_if_noexcept, utiliy (2011-01-17 更新) No.04 std::swap, utiliy (次回予定)

    C++0x 標準ライブラリ完全解説 まとめ - 野良C++erの雑記帳
  • One-Phase Construction 入門 〜 Constructor run once. - 野良C++erの雑記帳

    導入 皆さんは C++ と聞いて、まず何を思い浮かべますか? 「C++? そんなの過去の遺物だろ? GC ないとか原始的すぎるじゃん?」 って思う人もいれば、 「いや、 C++ って無闇に複雑すぎて使えない。正直 C 言語で十分でしょ」 って人もいるでしょう。 が、今回は、そういう「不便だ」「キモい」「でも迂闊に dis ると闇の軍団怖いし…」的な論争は*1とりあえず置いておくことにします。 代わりに、 「デストラクタや const は便利だよ!」 「 C 言語と連携が取りやすいのがいいね」 「それ以上に、ゼロオーバーヘッドだし、いざとなれば効率化できるのが素晴らしい」 「普段は効率化なんて意識しなくても使えるしね」 的な「 C++ を使う利点」を考えてみると、 テンプレートと、その応用例である STL が、 C++ を使う利点の中でも特に大きい、 そのことに異論を挟む人は少ないと思います

    One-Phase Construction 入門 〜 Constructor run once. - 野良C++erの雑記帳
  • それでも Boost.Optional を使う、大きく分けて2つくらいの理由 - 野良C++erの雑記帳

    Boost.Optional Must Go - 野良C++erの雑記帳 Boost.Optional Must Go (2) - 野良C++erの雑記帳 最近、何回かに分けて、 Boost.Optional について、(細かい)不満を日記に書いてきました。 これは別に Boost.Optional が嫌いだから不満を書いた訳ではなく、むしろ その逆、 Boost.Optional が便利な分、逆に不満点が目立つので書いていたわけですが、 よく考えたら、 Boost.Optional の便利さを、纏まった記事で書いていないなー、 と、そう思い至ったので、この辺で Boost.Optional を徹底的に推奨する記事でも書いてみようかな、 というわけで、さんざん既出なネタばかりですが、折角なので書いてみることにしましたよ。 冒頭に挙げた以外で参考になるような記事は、この辺でしょうか: C++

    それでも Boost.Optional を使う、大きく分けて2つくらいの理由 - 野良C++erの雑記帳
  • std::vector の shrink_to_fit - 野良C++erの雑記帳

    C++0x の std::vector には、新しく shrink_to_fit() メンバ関数が用意されています。 これは「 vector の確保しているメモリ領域を、その大きさに見合ったサイズまで縮小する」関数で、 典型的な使い方は、以下のような感じになります: // std::vector に格納される要素数の見当がつけられない // が、「上限」は分かる。このとき余計な領域の再確保を避けたい std::size_t const limit = 〜〜; // vector に格納される要素の上限 std::vector<T> vec; // まず上限までメモリ領域を確保する vec.reserve( limit ); // vec に格納していく // ... // 格納終了。しかし、 // このままだと巨大なメモリ領域を占有してしまうので、 // vec の確保している領域を「 s

    std::vector の shrink_to_fit - 野良C++erの雑記帳
  • 2010-04-17

    とても欲しい。 pcall と error で似たようなことはできるけど、やはり不十分だし。 明らかな異常系以外で例外に頼らなければいけない状況は変だ、と思い直した。 気軽にぽんぽん例外を投げるような設計は、どうなのだろう、と。 その辺は言語の文化も関わってくるけれど、例えばC++だと、例外は基的に「例外的な事情」がある時しか投げないような設計が多い( boost::lexical_cast のような例外も多いが)。 そういう「よくできたC++のライブラリ」は、事前チェックで例外を投げることを殆ど回避できる仕組みになってるし、例外を気軽に投げる設計のライブラリでも、例外が投げられることが正常な実行パスの中に含まれるようなプログラムを書くような事は、基的に行わない。 もっとも、この辺は正に言語の文化次第である。 例えば Python では、 for 文という基的な構造において、処理終了

    2010-04-17
  • C++でデストラクタを呼ばなくていい条件 - 野良C++erの雑記帳

    参考: デストラクタを呼ばずに再構築 - melpon日記 - HaskellもC++もまともに扱えないへたれのページ C++ では、動的に確保したメモリ領域にオブジェクトを構築した場合、 確保した領域を解放する前に、デストラクタを呼び出す必要があります: // 何らかの理由で new 以外の方法でメモリ確保する必要がある場合 // メモリ確保し、オブジェクトを構築する(todo:例外安全) void* const vp = allocate_memory( sizeof(T) ); T* const p = ::new(vp) T(); // 何らかの処理 // デストラクタ呼び出し p->~T(); // 解放 free_memory( vp ); 普通に C++ を使うだけであれば、動的メモリ確保は new/delete を使えばいいし、 そもそも unique_ptr とか sha

    C++でデストラクタを呼ばなくていい条件 - 野良C++erの雑記帳
  • Boost.Optional と Boost.InPlaceFactory で初期化遅延 - 野良C++erの雑記帳

    boost::optional は「値 T あるいは無効値」を取ることのできるクラスです。 通常このクラスは、「失敗するかもしれない」関数の戻り値として使用されます: #include <boost/optional.hpp> #include <iostream> // 例として std::getline を optional で実装してみる boost::optional<std::string> getline_optional( std::istream& in ) { std::string result; if( getline( in, result ) ) { // 行の読み取りに成功 return result; } // 失敗。無効値( boost::none )を返す return boost::none; } int main() { // cat コマンドっぽい挙

    Boost.Optional と Boost.InPlaceFactory で初期化遅延 - 野良C++erの雑記帳
  • C++/Boost 基礎文法最速マスター - 野良C++erの雑記帳

    参考: http://d.hatena.ne.jp/faith_and_brave/20100201/1264997004 「C++0xになると、C++03 でごちゃごちゃした部分がだいぶすっきり書けるようになる」 らしいですが、C++0xを待たなくてもBoostを使えばだいぶすっきり書けるので、 BoostでのC++入門はこんな感じだよー、という気持ちで以下略。 この記事はC言語をある程度理解していることが前提です。 1. Hello World C++/Boostでの出力はC++標準の IOStream ライブラリと Boost.Format を組み合わせて行います。 例として、C言語のprintfを用いた Hello World を、C++/Boostを使って書き直してみます。 #include <stdio.h> int main() { printf( "%s\n", "Hell

    C++/Boost 基礎文法最速マスター - 野良C++erの雑記帳
    tyru
    tyru 2010/02/03
    boost::tie使ってる例も見せてあげたら驚いたんじゃないかなーとか趣旨違ってるか・・・
  • 今更ながらに Boost.SmartPointers を考える - 野良C++erの雑記帳

    Smart Pointers というか主に shared_ptr ですが(scoped_ptr のこともたまには思い出してあげてね!)。 恐らくは散々ガイシュツなネタですが、まー「検索するのが面倒だ」って人の手助けになればいいかと思います。僕も検索するの面倒ですし。 というかこの記事書いてるときもロクに検索してないです。間違いとかあったらすみません。 疑問点とか有りましたら、自分で調べるか、あるいは僕に知らせてもらえると助かります。では、始めましょう。 [最終更新] 応用例にカスタムアロケータでの参照カウント管理を追加: 09/12/16 基的な使い道 まず基的なことについては、僕が説明するより、この動画を参照した方が速いでしょう: http://www.ustream.tv/recorded/2981654 それに対するついったーでの突っ込み: http://kiwofusi.sa

    今更ながらに Boost.SmartPointers を考える - 野良C++erの雑記帳
  • 1