Commit 5cfd8c22cf67c9941f2fc3f0cbbd363ed8fdbd3e

Authored by Grzegorz Jabłoński
1 parent f264a977

Added concepts example

examples08/01-template/makefile
1   -all: minimum swap1 swap2 bubblesort
  1 +all: minimum minimum_concepts swap1 swap2 bubblesort
2 2  
3 3 minimum: minimum.o
4 4 g++ -g -Wall -pedantic $^ -o $@
... ... @@ -6,6 +6,12 @@ minimum: minimum.o
6 6 minimum.o: minimum.cpp
7 7 g++ -g -c -Wall -pedantic $< -o $@
8 8  
  9 +minimum_concepts: minimum_concepts.o
  10 + g++ -g -Wall -pedantic $^ -o $@
  11 +
  12 +minimum_concepts.o: minimum_concepts.cpp
  13 + g++ -std=c++20 -g -c -Wall -pedantic $< -o $@
  14 +
9 15 swap1: swap1.o
10 16 g++ -g -Wall -pedantic $^ -o $@
11 17  
... ...
examples08/01-template/minimum_concepts.cpp 0 → 100644
  1 +#include <iostream>
  2 +#include <string>
  3 +#include <concepts>
  4 +
  5 +using namespace std;
  6 +
  7 +template <class T>
  8 +concept LessComparable = requires(const T l, const T r, bool res)
  9 +{
  10 + res = (l < r);
  11 +};
  12 +
  13 +template <class T> T minimum(T x, T y) requires std::constructible_from<T, const T&> && LessComparable<T>
  14 +{
  15 + if (x < y)
  16 + return x;
  17 + else
  18 + return y;
  19 +}
  20 +
  21 +class NotComparable
  22 +{
  23 +};
  24 +
  25 +class NotCopyConstructible
  26 +{
  27 + public:
  28 + NotCopyConstructible(){};
  29 + NotCopyConstructible(const NotCopyConstructible&) = delete;
  30 + friend bool operator<(NotCopyConstructible, NotCopyConstructible){return true;};
  31 +};
  32 +
  33 +int main()
  34 +{
  35 + int x = 50, y = 30;
  36 + string a = "hello", b = "goodbye";
  37 + cout << "minimum for ints " << minimum(x, y) << endl;
  38 + cout << "minimum for strings " << minimum(a, b) << endl;
  39 +// minimum(NotComparable(), NotComparable());
  40 +// minimum(NotCopyConstructible(), NotCopyConstructible());
  41 +
  42 +}
... ...