KisaragiEffective.github.io

Yeet.

View on GitHub

C++20で来るConceptの話

What is 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は合成することができる。