#include <concepts>
#include <iostream>

template<typename T>
void describe(T value) {
    std::cout << "generic " << value << '\n';
}

template<std::integral T>
void describe(T value) {
    std::cout << "integral " << value << '\n';
}

int main() {
    auto twice = [](auto value) {
        return value + value;
    };
    std::cout << twice(3) << '\n';
    std::cout << twice(0.5) << '\n';
    describe(3);
    describe(0.5);
    return 0;
}
