//#(compile) c++; compiler:g132; options:-O3 -std=c++23; libs:-
// https://godbolt.org/z/W6cdra8K9
#include <concepts> // integral
#include <iostream>
using namespace std;
// Concept explizit mit requires
template<typename T> requires integral<T>
auto add_1(T val) { return val+1; }
// abgekürztes Concept
template<integral T>
auto add_2(T val) { return val+2; }
// abgekürztes Funktionstemplate mit Concept
auto add_3(integral auto val) { return val+3; }
// Ad-hoc-requires für Funktionstemplate
auto add_4(auto val) requires integral<decltype(val)>
{ return val+4; }
int main() {
cout << add_1(1) << '\n'; // Ausgabe: 2
cout << add_2(1) << '\n'; // Ausgabe: 3
cout << add_3(1) << '\n'; // Ausgabe: 4
cout << add_4(1) << '\n'; // Ausgabe: 5
cout << add_3("text") << '\n'; // (ERR) Fehler
integral auto val = add_1(99); // auch für auto-Variablen
cout << val << '\n'; // Ausgabe: 100
}