#include <concepts>
#include <iostream>

template<typename T>
concept HasArea = requires(const T& item) {
    { item.area() } -> std::same_as<int>;
};

struct Box {
    int width;
    int height;
    int area() const {
        return width + height;
    }
};

template<HasArea T>
int report_area(const T& item) {
    return item.area();
}

static_assert(HasArea<Box>);
static_assert(!HasArea<int>);

int main() {
    std::cout << report_area(Box{3, 4}) << '\n';
    return 0;
}
