C++20で来るConceptの話
What is concept?
- booleanなconstexpr
- 制約を設けることができる
- 制約にも強弱がある
- 合成することができる
- 強い制約のものが優先して呼ばれる (かっこいい言葉で半順序という)
- 曖昧なときはコンパイルエラーになる
- conceptキーワードをつけて定義する
構文的なお話
例えば、ある型Tにoperator*を実装していることを要求するときは以下のようにする: (以下のコードは https://qiita.com/_Nnwww/items/5a242466e94b2e432376 より引用)
template<typename T>
concept bool Multipliable =
requires (T a, T b) {
a * b;
};
そして以下のように使う:
#include <iostream>
using namespace std;
auto square(Multipliable i) {
return i * i;
}
struct X{};
int main()
{
int a = 3;
struct X b;
cout << square(a) << endl; // OK
cout << square(b) << endl; // Err
return 0;
}
これで、今までは「(テンプレートが展開されたフェーズで)T * T
はできない、なぜならT型にT operator*(T)
が定義されていないから」とわかりにくいエラーが出ていたものが、「TはT operator*(T)を実装することを要求する!」とはっきりコンパイラに言われるようになった(??)
強弱的な話
conceptは合成することができる。
A & B
は両方を満足させる必要があるA | B
はどちらか片方でも満足させられればよい このとき、A & B
⊂A
⊂A | B
A & B
⊂B
⊂A | B
が満たされる。(わからない読者はTypeScriptやベン図を書いて考えてほしい)