C++ conceptsを試してみた (1)
C++20 から導入されるConceptsを試してみました。
cpp_akira さんがConceptの解説を書かれている[1]ので、自分なりに咀嚼して試してみます。
ビルド方法
現時点(2019年10月)で、Conceptを利用したプログラムをビルドするには、g++9以降が必要です。gccとclangのC++機能実装状況 (gcc[2], clang[3])によれば、
- gccは実装済みPRが提案されている
- clangは未対応
のようです。MacのHomebrewでインストールされたg++はパッチ適用済みのようですので、これを使います。
実際に、Mac上でConceptを使ったビルドをしてみます。 -std=c++2a
および -fconcepts
のフラグが必要です。
$ g++ -std=c++2a -fconcepts main.cpp
Conceptを使って型の制約を記述する
テンプレート引数の型がメンバ関数を持っている
// https://wandbox.org/permlink/njPaUxLdeDuXa81N // コンセプト Drawable を定義 template <class T> concept Drawable = requires(T& x) { x.draw(); }; // テンプレート引数のクラスが特定のメンバ関数を持っていることを規定する template <Drawable T> void f(T& x) { x.draw(); }
ただし、現時点では <concepts>
ヘッダのincludeを含め、すべての機能が動くわけではないようです。
例:
// [1]より引用 // https://wandbox.org/permlink/G1SAoPNBVIwPYvVk #include <concepts> template <class T, class U> concept EqualityComparable = requires (T a, U b) { {a == b} -> std::convertible_to<bool>; // 式の戻り値型も制約できる (直接の戻り値型は指定できない) };
引き続き、詳細な文法等の調査をしていこうと思います。
参考文献/リンク
- [1] コンセプト - cpprefjp C++日本語リファレンス
- [2] C++ Standards Support in GCC - GNU Project - Free Software Foundation (FSF)
- [3] Clang - C++17, C++14, C++11 and C++98 Status
変更履歴
- 誤字修正 thanks to @takeda25 さん