#pragma once #include #include namespace demo { template concept Addable = requires(T a) { a + a; }; template concept Sized = requires(T a) { a.size(); }; struct Base { int id; }; struct Helper { int work() { return 1; } }; template requires std::copyable && (Addable || Sized) struct Box : Base { T value; std::vector entries; Helper helper; using value_type = T; Box(Addable auto x) requires std::constructible_from : value(x) { helper.work(); } template requires requires(U u) { u.size(); } void set(const U& u) requires Addable { helper.work(); } void run(std::integral auto n) { helper.work(); } template requires std::convertible_to void assign(U u) { value = u; } }; using IntBox = Box; enum class State { idle, ready }; }