タグ

ブックマーク / faithandbrave.hateblo.jp (38)

  • 列挙型が特定の列挙子をもっているか判定する - Faith and Brave - C++で遊ぼう

    ひさしぶりにテンプレートメタプログラミングをしました。 候補となる列挙型がだいたい同じ列挙子をもっているけど、一部の列挙型にだけある列挙子が存在する場合もある、という場合に処理を集約させたい場合のコードです。 #define DEFINE_HAS_ENUMERATOR(name) \ struct has_enumerator_##name { \ template <class T> \ static constexpr decltype(T::name, bool{}) \ call(T) { return true; } \ static constexpr bool \ call(...) { return false; } \ } #define HAS_ENUMERATOR(type, name) has_enumerator_##name ::call(type{}) DEF

    列挙型が特定の列挙子をもっているか判定する - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2021/01/08
  • C++標準ライブラリの数学定数への道のり - Faith and Brave - C++で遊ぼう

    P0631R8 Math Constants C++20で数学定数が入ることが決まりましたね。やっと標準ライブラリの範囲で円周率を定数として使えるようになります。 ここまでの道のりですが、 constexpr (C++11) 変数テンプレート (C++14) インライン変数 (C++17) 数学定数 (C++20) とても長かったですね。 #include <iostream> #include <numbers> template <class T> T degree_to_radian(T x) { return x * std::numbers::pi_v<T> / static_cast<T>(180.0); } int main() { float y = degree_to_radian(90.0f); std::cout << y << std::endl; // 1.570

    C++標準ライブラリの数学定数への道のり - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2019/08/22
  • C++1z 古くなった機能を非推奨化 - Faith and Brave - C++で遊ぼう

    C++1zから、標準ライブラリのいくつかの機能が非推奨となります。非推奨となった機能は将来のバージョンで削除される可能性がありますのでご注意ください。 std::iteratorクラス 自作イテレータを作るときに基クラスとして使用するstd::iteratorクラスですが、これを使ってもイテレータを定義するのはあまり簡単になりませんでした。 このクラスを使用することによって問題がより複雑になってしまうケースもありましたので、非推奨となります。 Boost.Iteratorのようなイテレータを簡単に定義するための新たな仕組みは提供されませんので、標準ライブラリの範囲では、イテレータは最初から最後まで自分で定義することになります。 std::allocatorクラスのいくつかのメンバと、std::allocator<void> C++11からアロケータの中間インタフェースとデフォルト実装を提

    C++1z 古くなった機能を非推奨化 - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2016/09/12
  • C++1z なんでも代入できるanyクラス - Faith and Brave - C++で遊ぼう

    C++1zでは、コピー可能かムーブ可能であればどんな型でも代入できるanyクラスが入ります。C++には全ての型の継承元のobjectクラスというものはないので、その代わりにこのクラスを使えます。 このクラスのために、<any>ヘッダが新規追加されます。 #include <iostream> #include <any> #include <string> int main() { std::any a = 3; // int値を代入 a = std::string("hello"); // stringオブジェクトを代入 // 中身を取り出す // 取り出せなかったらstd::bad_any_cast例外 try { std::string s = std::any_cast<std::string>(a); std::cout << s << std::endl; } catch (s

    C++1z なんでも代入できるanyクラス - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2016/07/30
  • C++14対応のC++ポケットリファレンス 第2版 - Faith and Brave - C++で遊ぼう

    改訂新版 C++ポケットリファレンス - 技術評論社 改定新板 C++ポケットリファレンス - Amazon.co.jp おかげさまでご好評いただいております書籍『C++ポケットリファレンス』ですが、この度、C++規格の最新バージョンC++14(ISO/IEC 14882:2014)に対応した改訂版を出版します。 基文法、ライブラリの各章において、C++14で追加された機能の解説を加筆しました。 また、それ以外の項目についても、解説の加筆や改善を行っています。 ページ数も16ページほど増量し、544ページになっています。そろそろポケットに収納するのは厳しいかもしれません。 コンパイラのC++14への対応も非常に早いので、より多くの方にC++14の機能を使っていただければ幸いです。 『C++ポケットリファレンス』第2版は、2015年6月4日に発売予定です。電子書籍版は、技術評論社のDigi

    C++14対応のC++ポケットリファレンス 第2版 - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2015/05/18
  • C++14でのreturnとreturn (…)の違い - Faith and Brave - C++で遊ぼう

    C++14で導入されるdecltype(auto)を使うと、returnとreturn (…)で戻り値の型が変わる。前者は値、後者は参照となる。 decltype(auto) f() { static int value = 3; return value; } decltype(auto) g() { static int value = 3; return (value); } int main() { int f_result = f(); int& g_result = g(); } 参照 C++11/14 and return( … ) vs return - StackOverflow C++14 通常の関数の戻り値型を推論

    C++14でのreturnとreturn (…)の違い - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2014/06/11
  • C++テンプレートテクニック 第2版 を出します - Faith and Brave - C++で遊ぼう

    2009年に出版した書籍『C++テンプレートテクニック』の第2版を出版します。 C++テンプレートテクニック 第2版 - Amazon.co.jp C++テンプレートテクニック 第2版 - SBクリエイティブ 発売日は、2014年4月17日(木)です。 C++テンプレートテクニック 書は、プログラミング言語C++のテンプレート機能に関する技法を解説したです。 プログラムをより汎用的にしていくにあたって起きる、様々な問題への解法を提供します。 第2版の更新内容 第2版の主な更新は、C++11への対応です。C++11に追加された機能を使用した各種技法を掲載しています。C++03の技法で今もなお有用なものは残してあります。 第2版では、以下のような変更を行いました: 第1版の章「Extension Member Function」および「C++0xにおけるテンプレート」を削除 新章「コンセプ

    C++テンプレートテクニック 第2版 を出します - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2014/03/26
  • C++14とC++1yの新しいペーパーがさらに公開された - Faith and Brave - C++で遊ぼう

    New paper: N3744, Proposing pure—Walter Brown 関数が外部の変数を変更しない「純粋関数(pure function)」であることをコンパイラに伝える、pure属性を入れよう、という提案。 関数が引数のみに依存して結果を生成するようになると、状態変化によるバグの混入が起こらなくなるので、これはぜひほしいですね。 GCCにはだいぶ前から、__pure__属性があります。それとD言語にも。 標準ライブラリで純粋関数にならない例としては、以下のようなものがあります: printf : I/Oは副作用である tan : グローバル変数であるerrnoを更新する longjmp : 関数のreturnに失敗する mersenne_twister_engine<>::operator() : メンバ変数として持っている状態を更新する New paper: N3

    C++14とC++1yの新しいペーパーがさらに公開された - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2013/08/30
  • C++ポケットリファレンスについて書ききれなかった、いくつかのこと - Faith and Brave - C++で遊ぼう

    昨日、『C++ポケットリファレンス』の紹介エントリを書きましたが、ここではそのエントリで書ききれなかったことを書きます。読者向けではなく、このの著者とレビュアーのためにプロジェクトの記録として残すことと、の執筆に携わる人に参考にしてほしい、という意図で書きます。 プロジェクトメンバの構成 『C++ポケットリファレンス』の執筆は、6人の共著者、編集者が1人と、5人のレビュアーが関わっています。ぼくはとりまとめ役です。 その内、レビュアーの一人である兎さんが、レビュー管理のためのRedmineを立てて運営してくれていて、同様にレビュアーの一人であるDigitalGhostさんが、原稿管理のためのGitリポジトリを用意してくれました。Gitリポジトリは、弊社ロングゲートのサーバーに置いてあります。 使用したサービスとツール 単著でレビュアーなしであれば、エディタで原稿を書き、それを編集者に送

    C++ポケットリファレンスについて書ききれなかった、いくつかのこと - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2013/04/25
  • 『C++ポケットリファレンス』という本を書きました! - Faith and Brave - C++で遊ぼう

    C++11対応の『C++ポケットリファレンス』というを書きました。 C++ポケットリファレンス - Amazon C++ポケットリファレンス - 技術評論社 書は、標準C++のリファレンスです。「何がしたい」から「どうやって」を調べる、逆引きリファレンスの形式をとっています。 ポケットリファレンスはシリーズもので、これまで多くの言語やフレームワークのが出ていますが、縁あって技術評論社さんからC++版のお話をいただき、書かせてもらいました。 今回は、私を含む、C++コミュニティのメンバ6人で書きました。 書はライブラリの使い方を主題として扱いますが、C++11に関する日語書籍はこれが初となる実情があるため、言語の基文法も力を入れて書いています。そのため、書はライブラリのリファレンス書としてだけでなく、C++の入門書として使うこともできると思います。 「ポケットリファレンス」と

    advblog
    advblog 2013/04/24
  • フリーストアを使わない可変長配列 - Faith and Brave - C++で遊ぼう

    static_vector using aligned_storage static_vector: fixed capacity vector update ソースコード: http://svn.boost.org/svn/boost/sandbox/varray/ 現在、BoostのSandbox上で、フリーストア(ヒープ)を使わない可変長配列の開発が進められています。 このコンテナは、テンプレートパラメータで決定した容量に基いて、静的なサイズの配列を内部的に持ち、その配列に対して配置newすることで可変長配列を実現します。 使い方は以下のようになります。 #include <iostream> #include <boost/container/varray.hpp> int main() { // intの可変長配列を定義。最大要素数は3 boost::container::var

    フリーストアを使わない可変長配列 - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2013/02/04
  • C++1y boolへの変換演算子をコンテナに持たせる - Faith and Brave - C++で遊ぼう

    N3509 Operator Bool for Ranges std::vector、std::stringといったコンテナクラスに、operator boolを持たせよう、という提案。 これがあると、!empty()を必要とする状況でプログラムの冗長性を解消できる、というのが動機です。 // 従来の方法 string s = f(); if (!s.empty()) { // sを使った処理 } // operator boolがある場合 if (string s = f()) { // sを使った処理 } こういう書き方は、Boost.Optionalでよく使います。文字列だと、1行ずつのファイル読み込み処理などで使えると思います。 boolへの変換演算子は、Boost.Rangeのiterator_rangeではすでに提供されています。

    C++1y boolへの変換演算子をコンテナに持たせる - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2013/01/28
  • 『C++のためのAPIデザイン』レビュー - Faith and Brave - C++で遊ぼう

    翻訳監修の三宅さん( @miyayou )さんから献いただきました!ありがとうございます。 書は、関数、クラス、ライブラリといった誰かに使ってもらうためのプログラムを書くプログラマのためのです。ほかの人に使ってもらうプログラムを書くために考えるべき多くのことが書かれています。たとえば、以下のようなことを考える必要があります: ユーザーに公開するインタフェースはどうあるべきか。実装詳細はどれで、ユーザーは何を知っていれば十分なのか。それはどの場面で使用できるだろうか、いま目の前にある目的を達成できればいいのか、はたまた多くの場面で再利用したいのか。 バージョンに関しても考えなければいけない。このAPIは後方互換性を保てるほど入念に考えられているだろうか。どうしても破壊しなければいけない場合、どういう設計選択をするべきか。 ドキュメントはどこまで書くべきだろうか。自動テストは何のために書

    『C++のためのAPIデザイン』レビュー - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2012/11/02
  • C++Now! 2012に参加してきました - Faith and Brave - C++で遊ぼう

    毎年5月にアメリカのコロラド州アスペンで開催されているBoostConというBoost C++ Librariesのカンファレンスが今年からC++Now!という名前に変わり、今回それに近藤さん id:redboltz と一緒に参加してきました。 非技術的な内容は、後ほどBloggerの方に書こうと思います。 1週間の濃厚な日々の記録のため、けっこう長くなってしまうことをご容赦ください。 0日目(日曜日) Registration 初日は16:00から参加登録 + 雑談を行うRegistrationがありました。会場に入った途端自己紹介もしてないのに「Are you cpp_akira?」と話しかけてきた外人さんがいて、「あ、これが噂の日語を話せるRay Fixか!」とすぐに把握して近藤さんに紹介されつつ少し話してました。その後、今回Boost.Coroutineの発表を行ったNat Go

    C++Now! 2012に参加してきました - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2012/05/22
    B!
  • C++のリファレンスサイトを作りました - Faith and Brave - C++で遊ぼう

    cpprefjp - C++語リファレンス まだサイトを用意しただけで、中身はまだまだです。 C++ Referenceが便利だったので、それの日語版 + C++0x対応したサイトがほしい、というのが動機です。 boostjp Google Groupのメンバであれば編集できるようにしてありますので、サイトの充実のためにみなさんご協力お願いします。 cpprefjpのためのGoogle Groupも用意しようかと考えましたが、boostjpとメンバが大幅にかぶりそうなので、boostjp一に絞ります。 cpprefjpでのご相談は、boostjpの方に投稿していただければと思います。

    C++のリファレンスサイトを作りました - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2011/01/18
  • 「Scalaがもたらす言語の進化」というタイトルで発表してきた - Faith and Brave - C++で遊ぼう

    Scala勉強会第9回 in 渋谷で発表してきました。 まだScalaでがりがりコード書けないので、外の言語からみたScalaの話をしました。 Scala lang evolutionView more presentations from faithandbrave.

    「Scalaがもたらす言語の進化」というタイトルで発表してきた - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2010/10/28
  • Boost本:『Introduction to the C++ Boost Libraries Volume I - Foundations』 - Faith and Brave - C++で遊ぼう

    新たなBoost C++ Librariesの解説書である 『Introduction to the C++ Boost Libraries Volume I - Foundations』 が発売したようです。 1, 15, 18章は無料で読むことができます。

    Boost本:『Introduction to the C++ Boost Libraries Volume I - Foundations』 - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2010/09/23
  • 「プログラミングの魔導書」の情報公開 - Faith and Brave - C++で遊ぼう

    http://longgate.co.jp/products.html 弊社、株式会社ロングゲートで、プログラミング雑誌を作るというプロジェクトが進行しています。 書創刊の目的は、プログラミングの入門記事が巷に溢れる今、プログラマのさらなる成長のため情報発信を行い、業界全体の技術力を向上させることです。 雑誌といっても、記事の質を保つために不定期刊行としていることから、実際には雑誌ライクな書籍となります。 書籍名は「プログラミングの魔導書〜Programmers' Grimoire〜」です。 創刊号となる今回のテーマは、サブタイトルにも含まれている「C++」です。全ての記事がプログラミング言語C++に関するものとなっています。 Vol.1のテーマをC++としたのは奇をてらったものではありません。 C++は習得の難しい言語と言われておりますが、近年はBoost C++ Librariesに

    「プログラミングの魔導書」の情報公開 - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2010/06/02
  • C++0x 標準コンテナのsize()の計算量を規定 - Faith and Brave - C++で遊ぼう

    標準コンテナのsize()メンバ関数の計算量を全てO(1)にしようという提案があり、 賛成多数で通ってしまったらしいです。 つまり、サイズ用のメンバ変数を持たずに実装されていたstd::listやstd::set等に サイズ用メンバ変数が新たに追加されることになります。 組み込み環境でSTL使ってるところがコンパイラをアップデートしてC++0xに対応すると メモリ不足で動かなくなる可能性があるのですが、そのへん考慮されているのだろうか。 以下、N2920の投票結果から 我々は、C++0X working paperにN2923 "Specifying the complexity of size() (Revision 1)"を適用する。 Crowlは、これによってABIが破壊的に変更されるかどうか尋ねた。 Hinnantは、実装に依存すると返答した。いくつかの実装は変わるだろう。 Bro

    C++0x 標準コンテナのsize()の計算量を規定 - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2009/09/02
  • constメンバ関数は重要 - Faith and Brave - C++で遊ぼう

    私は基的に、C++でソース書くときはやたらめったらconst付けます。 なぜならHaskellが好きだからです(ぇ じゃなくて、状態の変更によるバグを減らすためです。 しかし、他人が書いたソースを見てると、オブジェクトのconst操作を考えて設計されてないことが けっこうあり、Is〜とかGet〜といった名前の関数の中でメンバの状態を変更してたりします。 これはとくに、JavaやC#のようなconstメンバ関数がない言語からC++に移植するようなときに 起こりやすいのですが、C++でもconstメンバ関数の存在を知ってか知らずかconstが付いてないことが多々あります。 書籍でいうと、『Game Programming Gems』では明らかにconst操作なメンバ関数にconst付いてないですね。 C++で大きなプログラムを組む際は、元となるコード(移植元やライブラリ)がオブジェクトのco

    constメンバ関数は重要 - Faith and Brave - C++で遊ぼう
    advblog
    advblog 2009/07/16