C++

C++ の可変引数リストに non trivial な値を渡すとコンパイルエラーになる

C++

以下のようなコードを Clang でコンパイルしたところエラーになりました。 [](...){}(std::string("homu")); // error: cannot pass object of non-trivial type 'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >') through variadic method; call will abort</char></char,>…

C++17 の std::optional に無効値を設定する

C++

C++17 では Boost.Optional が新しく標準ライブラリ入りしました。 Boost.Optional で無効値を指定する場合は boost::none を使っていたんですが、標準ライブラリの std::optional では std::nullopt を使用して無効値を指定します。 [ソースコード] #includ…

void でキャストすることで "unused" の警告を回避する

元々は C言語?で使われているようなハックらしいのですが、知らなかったので覚書。 さて、例えば次のように関数の引数を assert チェックしてる関数があるとします。 void func(int value){ assert(value == 42); } この場合、デバッグビルドでは問題ないん…

【初心者C++er Advent Calendar 2016 21日目】C++ でプリプロセスマクロを使う場面

C++

初心者C++er Advent Calendar 2016 21日目の記事です。 さて、巷ではマクロを使用したコードを公開すると『static const を使え』や『typedef しろ』、『関数テンプレートでおk』などと斧が飛んでくる突っ込まれることが多いです。 これは C++ では『基本的…

【初心者C++er Advent Calendar 2016 20日目】関数テンプレートの呼び出しに優先順位をつける

C++

初心者C++er Advent Calendar 2016 20日目の記事です。 クリスマスが終わって『もはや Advent Calendar とは…』となってるんですが、まあ埋まってないより埋まってるほうがいいかなーと。 今回は初心者向けかどうか怪しい内容ですが、ちょっとしたハックでも…

【初心者C++er Advent Calendar 2016 19日目】C++ で楽しいメタプログラミングをしよう

C++

初心者C++er Advent Calendar 2016 19日目の記事です。 クリスマスから少し過ぎてしまいましたが、最後に楽しくメタプログラミングしてみる記事でも。 初心者C++er Advent Calendar 2016 が全部うまるといいですね。 [メタプログラミングとは] メタプログラ…

【初心者C++er Advent Calendar 2016 17日目】C++ で型と値を理解する

C++

初心者C++er Advent Calendar 2016 17日目の記事です。 初心者ネタに型と値の話でも。 [値とは] C++ における値とは数値や文字列、クラスのインスタンスなどを指します。 // 数値や小数 42 3.14f // 文字や文字列 'c' "homu" // クラスのインスタンス std::s…

【初心者C++er Advent Calendar 2016 11日目】C++ で型によるコンパイル時条件分岐技法まとめ

C++

初心者C++er Advent Calendar 2016 11日目の記事です。 空いてるようなのでまた書きました。 さて、初心者用ということで型を使用した『コンパイル時条件分岐技法』を簡単に紹介してみます。 [注意] 本記事では C++11 で動作することを想定してるコードにな…

【C++ Advent Calendar 2016 13日目】C++ で楽しく Expression Templates しよう

C++

C++ Advent Calendar 2016 13日目の記事です。 13日目が空いてるようなのでちょっと Expression Templates というマニアックなネタでも。 まあ C++ プロの方なら Expression Templates なんて余裕ですよね。 [注意] 本記事のコードは基本的には C++14 に準じ…

【C++ Advent Calendar 2016 22日目】C++ で enable_if を使うコードのベストプラクティス

C++

[追記] @pink_bangbi typename std::enable_if<..., std::nullptr_t>::type* = nullptr の * は余計ではありませんか。これだと nullptr_t にする意味が— akinomyoga (@akinomyoga) 2016年12月22日 すみませんすみません、修正しました。 [本編] C++ Advent …

【初心者C++er Advent Calendar 2016 13日目】予約済み識別子に注意しよう

C++

初心者C++er Advent Calendar 2016の13日目が空いてるようなの書きました。 本記事は初心者C++er Advent Calendar 201613日目の記事になります。 初心者C++er Advent Calendar 2016では 3回目の記事になりますが、今回は予約済み識別子の話です。 [予約済み…

【初心者C++er Advent Calendar 2016 8日目】関数テンプレートと関数オブジェクト

C++

タイトルは釣りです。 初心者C++er Advent Calendar 2016 8日目の記事になります。 8日が空いていたので簡単なものを書きます。 前回の記事を書いたあとに (省略されたtemplateのが気になった)— Sd2E 002/100 (@chiwawa_star) 2016年12月6日 と、言われたの…

【初心者C++er Advent Calendar 2016 3日目】C++ で型推論(auto)しよう

C++

初心者C++er Advent Calendar 2016 3日目の記事です。 3日目が空いてるようなので書いてみました。 今回は初心者向けの Advent Calendar ということで軽めの記事になります。 また、本記事では C++14 を基準としたコードになります。 [C++ で型を書く場面] …

Boost 1.62.0 がリリース

C++

最近はあまり Boost も触っていないが Boost 1.62.0 がリリースされたらしい。 今回は新しく以下の2つのライブラリが追加された。 Fiber QVM 両方共、昔から提案はされていたもののなかなか組み込まれなかったので、今回追加されたのは感情深い。

C++ の range-based for 内で iterator を進めたい

C++

通常 range-based for を使用する場合は iterator ではなくて実体を参照するのでユーザから iterator の操作を行うことは出来ません。 ので、range-based for 内でも間接的に iterator を操作できるようなラッパーを書いてみました。 [コード] #include <vector> #in</vector>…

C++ の range-based for でループカウンタを使用する

C++

Twitter でみかけたので書いてみた。 一番簡単なのは boost::adaptors:indexed 使うのが楽っぽい。 [コード] #include <vector> #include <iostream> #include <string> #include <boost/range/adaptor/indexed.hpp> int main(){ std::vector<std::string> table = { "homu", "mami", "mado"}; for(auto&& it : table | boost::adaptor</std::string></boost/range/adaptor/indexed.hpp></string></iostream></vector>…

clang-check で -std=c++14 を使う

C++

C++14 に対して clang-check を使おうと思ったんですが $ clang-check -std=c++14 main.cpp -- clang-check: Unknown command line argument '-std=c++14'. Try: 'clang-check -help' clang-check: Did you mean '-h=c++14'? みたいに単純に -std=c++14 をつ…

std::getline を利用して任意の文字で文字列を分割する

C++

知らなかったので覚書。 [コード] #include <iostream> #include <string> #include <sstream> #include <vector> int main(){ std::string input = "homu,mami,mado"; std::istringstream iss(input); std::string str; std::vector<std::string> result; // , ごとに std::getline で文字列を読みこんでくる</std::string></vector></sstream></string></iostream>…

C++ でハミング重みを求める その2

C++

前回は自分でコードを書いて求めたのですが、そもそも <bitset> 使えば簡単に求めることが出来ます。 #include <bitset> #include <iostream> int main(){ std::cout << std::bitset<32>(100).count() << std::endl; std::cout << std::bitset<32>(9859712).count() << std::endl; std:</iostream></bitset></bitset>…

C++ でハミング重みを求める

C++

chiwawa-star.hatenablog.com ここに載ってる『1からNまでの数字を2進数に変換してbit 1 をcountする』って処理をもっと簡単に出来ないのか調べてみました。 こういう『シンボル列中の 0 以外のシンボルの個数』のことをハミング重みというみたいです。 で、…

C++11/14 でテンプレートを使用する場面

C++

C++03 ではせいぜいクラスや関数ぐらいでしかテンプレートを使う場面はなかったのですが C++11/14 でテンプレートを使う場面が増えたのでまとめてみました。 クラステンプレート(C++11) クラスにテンプレート型を渡します。 template<typename T> struct holder{ T value</typename>…

Boost.Hana を使って名前付き引数

C++

Boost.Hana を使って名前付き引数(っぽいの)をやってみた。 [コード] #include <iostream> #include <boost/hana.hpp> template<typename T> void print(T t){ std::cout << t[BOOST_HANA_STRING("name")] << ":" << t[BOOST_HANA_STRING("age")] << std::endl; } int main(){ using namespace bo</typename></boost/hana.hpp></iostream>…

C++ でフィボナッチ数列をメモ化してみた

C++

そういえば書いたことがなかったかも?と思ったので C++ でフィボナッチ数列をメモ化してみました。 ポイントはメモ化したデータをグローバル領域に置きたくなかったので関数オブジェクト化してメモ化したデータはメンバ変数で保持するようにしました。 [コ…

C++14 でYコンビネータ

C++

#include <iostream> int main(){ auto Y = [](auto f){ return [=](auto... args){ return f(f, args...); }; }; auto f = Y([](auto f, int n)->int{ return n == 1 ? 1 : n + f(f, n-1); }); std::cout << f(10) << std::endl; return 0; } /* output: 55 */ 多相ラ</iostream>…

Problem - 208A - Codeforces を C++ で書いた

C++

[元ネタ] Round #130 A. Dubstep|Codeforces - C++競プロ学習日記(仮) https://t.co/SOOFOecs0vちわわさんのこれ、Pythonで正規表現なしワンライナーやってみました。https://t.co/b4vSSCg4kw— みやこ@まだPython2で消耗し文字数 (@MiyakoDev) 2016年6月25…

C++ の stream 入力で末尾にゴミが入ってるかどうかを確認する

C++

Twitter でツッコまれたんですが、例えば以下のように std::stringstream を使った場合はエラーになりません。 #include <iostream> #include <sstream> int main() { // 末尾にゴミがある std::stringstream str("123x"); int x; str >> x; std::cout << x << std::endl; // =></sstream></iostream>…

conan を使って C++ で json を扱うためのパッケージを読みこむ

C++

conan のどんなパッケージがあるか調べていたら json を読みこむためのパッケージがあったのでせっかくなので試してみました。 C/C++ Open Source Package Manager GitHub - open-source-parsers/json: JSON for Modern C++ [conanfile.txt を作成する] 適当…

gcc でファイルからオプションを読みこむ

C++

gcc で @{filename} とすればそのファイルに書かれてるオプションをコマンド引数に追加できるみたい。 [options.gcc] -std=gnu++1y -I~/build/boost/boost_1_61_0 [test.cpp] #include <iostream> #include <boost/config.hpp> int main(){ std::cout << BOOST_COMPILER << std::endl; re</boost/config.hpp></iostream>…

C/C++ のパッケージマネージャーである conan を使ってみた

C++

TL で見かけたので試してみた。 C/C++ Open Source Package Manager [conan のインストール] conan は pip からインストールすることが出来ます。 $ pip install conan $ conan --version Conan version 0.9.4 他には brew やバイナリが配布されているみたい…

C++17 の std::void_t

C++

C++17 では std::void_t というメタ関数が追加されるらしい。 これは、 template<typename...> using void_t = void; と、いう風に定義されています。 [使い方] このメタ関数は次のように使うみたい。 template<typename, typename = std::void_t<> > struct has_type_member : std::false_type {}; template<typename T> </typename></typename,></typename...>…

marching.vim でプリコンパイル済みヘッダーを使用して C++ のコード補完を高速にする

C++

先日、Clang でコンパイル済みヘッダーを試したのですが、これを marching.vim でも使ってみたいと思います。 今回はひとつのプリコンパイル済みヘッダーファイルを共有して使ってみます。 GitHub - osyo-manga/vim-marching: Async clang code completion. …

C++ で特定の型での可変長引数を受け取る

C++

例えば『int 型の可変長引数』みたいな感じで受け取るコードを考えてみた。 [std::initializer_list を使う] std::initializer_list<int> で受け取ります。 void print(std::initializer_list<int> xs){ for(auto&& x : xs){ std::cout << x << std::endl; } } print({</int></int>…

Clang でプリコンパイル済みヘッダーを使う

C++

Clnag でプリコンパイル済みヘッダーを使ってみたので覚書。 [プリコンパイル済みヘッダーを生成] まず、プリコンパイルしたヘッダーファイルを用意します。 // header.h // とりあえず、重そうな標準ライブラリを列挙 #include <iostream> #include <vector> #include <map> #inclu</map></vector></iostream>…

C++ で標準入力から文字列を n 回読みこむ

C++

某人が書いてるコードでよくそういう処理が出てくるので簡単に出来ないか書いてみた。 #include <iostream> #include <iterator> #include <algorithm> #include <vector> int main(){ int n; std::cin >> n; std::vector<std::string> v{n} std::copy_n(std::istream_iterator<std::string>{std::cin}, v.size(), v.begin()); </std::string></std::string></vector></algorithm></iterator></iostream>…

C++14 で 1_upto(10) みたいな風に書く

C++

『n 回のループを簡単に書きたい〜』ってことでユーザ定義リテラルを使って upto を書いてみた。 [コード] template<typename T> struct numeric_range{ struct iterator{ auto operator ++(){ return ++value; } auto operator *() const{ return value; } bool operato</typename>…

BOOST_PP_COUNTER

C++

BOOST_PP_COUNTER を利用すると __COUNTER__ のような事が出来ます。 ただし、__COUNTER__ とは違い、マクロを呼び出す度に BOOST_PP_UPDATE_COUNTER() で更新してやる必要があります。 [コード] #include <iostream> #include <boost/preprocessor/slot/counter.hpp> int main(){ int value = 0; value += B</boost/preprocessor/slot/counter.hpp></iostream>…

C/C++ の __COUNTER__ マクロ

C++

__COUNTER__ は 0 から始まり呼び出す度に +1 されるマクロです。 [コード] #include <iostream> int main(){ ary auto = { __COUNTER__, __COUNTER__, __COUNTER__, __COUNTER__ }; for(auto&& it : ary){ std::cout << it << std::endl; } return 0; } /* output: 0 </iostream>…

C++11 で Boost.MPL.lambda みたいなの書いてみた

C++

書いたことがなかったので書いてみた。 [コード] #include <utility> #include <tuple> template<std::size_t Index> struct placeholder{ template<typename... Args> struct apply : std::tuple_element<Index, std::tuple<Args...>>{}; template<typename... Args> using apply_t = typename apply<Args...>::type; }; using _1 = placeholder…</args...></typename...></index,></typename...></std::size_t></tuple></utility>

C++14 で複数の戻り値を返す

C++

std::tuple を使ってもいいのですが、C++14 の場合は内部クラスを戻り値として返すことも出来ます。 [コード] #include <iostream> auto calculate(int x, int y){ struct result_t{ int add; int sub; }; auto a = x + y; auto s = x - y; return result_t{ a, s }; r</iostream>…

std::string の途中に null 文字が含まれている場合の処理

C++

Twitter で見かけたんですが、次のように途中に null 文字が含まれている場合でも最後まで出力されます。 #include <string> #include <vector> #include <iostream> int main(){ std::vector<char> chars { 'h', 'o', '\0', 'm', 'e' }; std::string str(chars.begin(), chars.end()); std::</char></iostream></vector></string>…

C++ でアロー演算子をオーバーロードした時の注意

C++

以下の例だとオーバーロードしたアロー演算子は呼び出されません。 #include <iostream> struct X{ X* operator ->(){ std::cout << "operator ->" << std::endl; return this; } void func(){ std::cout << "func" << std::endl; } }; int main(){ X* x = nullptr; x-</iostream>…

【初心者 C++er Advent Calendar 2015 ではない】C++ における const をつける位置の違い

C++

この記事は初心者 C++er Advent Calendar 2015の6日目の記事になります。 今日はクリスマス・イブ!!ってことで、せっかくなので穴が空いていた6日目の記事を書きました。 と、書いたんですが、すでにいなむさんがに先をこされていました・・・。 まぁでも…

【初心者 C++er Advent Calendar 2015 11日目】C++ における class と struct の違い

C++

この記事は初心者 C++er Advent Calendar 2015の11日目の記事になります。 今日はクリスマス・イブ!!ってことで、せっかくなので穴が空いていた11日目の記事を書きました。 クリスマスとか早く爆発してほしい さて、C言語にデータ構造を定義するための str…

【初心者 C++er Advent Calendar 2015 1日目】初心者が C++ を勉強するときに最低限押さえておいたほうがよい C++11/14 の機能

C++

この記事は初心者 C++er Advent Calendar 2015の1日目の記事になります。 本アドベントカレンダーはまだ空きがあるので気になる方は参加してみるとよいと思います。 さて、最近だと C++11/14 で書かれている本も増えてきたんですが、やっぱり昔の入門書だと…

C++ のラムダ式の引数型を推論する

C++

そういう話が Slack の C++ の会で出てたので簡単にラムダ式の引数型を取得するメタ関数を書いてみた。 #include <utility> template<typename... Args> struct parameter_pack{}; template<typename F, typename R, typename... Args> parameter_pack<Args...> args_impl(F, R(F::*f)(Args...) const); template<typename F> auto args(F f)->decltype(a</typename></args...></typename></typename...></utility>…

C++03 で has_xxx の実装

C++

久々に書いてみたら全然書き方覚えてなかったので覚書。 template<typename T> struct sfinae_helper{ typedef void type; }; template<typename T, typename U = void> struct has_xxx{ static bool const value = false; }; template<typename T> struct has_xxx<T, typename sfinae_helper<typename T::xxx>::type>{ static bool const value = tru…</t,></typename></typename></typename>

C++ の会に参加している

最近、主に Slack で活動してる C++ の会に参加してみました。 主に Slack で雑談でしてるだけなんですが、興味のある方はこちらから登録してください。 アクティブユーザが少なくて寂しい。

C++ の private メンバにアクセスする手段

C++

特に面白みもないんだけどメンバ変数のポインタがわかっていればアクセスすることは可能よね、と。 [コード] #include <iostream> struct X{ auto get_value_ptr(){ return &X::value; } private: int value = 42; }; int main(){ X x; // error // x.value; auto valu</iostream>…

LLVM/Clang 3.7 がリリース

いつの間にか 3.7 がリリースされていました。 リリースノートは以下の通り LLVM 3.7 Release Notes LLVM 3.7 documentation

Boost.TypeErasure のミニマム実装

その昔に書いたコードを発掘したので載せてみるなど。 このコードは Boost.TypeErasure がリリースされた頃に書いたので、現在の実装はまた別のものになっているかも知れない。 [コード] #include <iostream> #include <boost/any.hpp> template<typename Concept, typename T> struct adapter{ static void apply(bo</typename></boost/any.hpp></iostream>…