本当は怖いHPC

HPC屋の趣味&実益ブログ

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>; // 式の戻り値型も制約できる (直接の戻り値型は指定できない)
};

引き続き、詳細な文法等の調査をしていこうと思います。

参考文献/リンク

変更履歴

  • 誤字修正 thanks to @takeda25 さん
【広告】