#include #include #include #include struct Snapshot { std::size_t rows; }; class Batch { std::size_t rows_; public: explicit Batch(std::size_t rows) : rows_(rows) {} std::size_t size() const { return rows_; } }; template struct count_traits; template<> struct count_traits { static std::size_t get(const Snapshot& v) { return v.rows; } }; template<> struct count_traits { static std::size_t get(const Batch& v) { return v.size(); } }; template concept RecordCount = requires(const T& v) { { count_traits::get(v) } -> std::same_as; }; template std::size_t count_of(const T& v) { return count_traits::get(v); } int main() { static_assert(RecordCount); static_assert(RecordCount); static_assert(!RecordCount); Snapshot a{3}; Batch b{5}; assert(count_of(a) == 3); assert(count_of(b) == 5); std::cout << count_of(a) + count_of(b) << "\n"; }