#include <iostream>
#include <string>
#include <type_traits>

constexpr int square(int value) {
    return value * value;
}

template<typename T>
void show(const T& value) {
    if constexpr (std::is_integral_v<T>) {
        std::cout << value << '\n';
    } else {
        std::cout << value.size() << '\n';
    }
}

int main() {
    constexpr int known = square(3);
    static_assert(known == 9);
    int input{4};
    std::cout << known << '\n';
    std::cout << square(input) << '\n';
    std::cout << std::is_integral_v<int> << ' '
              << std::is_integral_v<double> << ' '
              << std::is_same_v<int, int> << '\n';
    show(4);
    show(std::string{"cat"});
    return 0;
}
