#pragma once #include #include namespace saw { template class i_data_server { protected: ~i_data_server() = default; public: virtual std::pair get_class_id() const = 0; template error_or> cast_to(){ { auto rhs = get_class_id(); if(To::class_id.first == rhs.first && To::class_id.second == rhs.second){ return {ptr{*static_cast(this)}}; } } return make_error("Class IDs are not matching."); } }; template class data_server; template class data_client; namespace impl { template struct data_server_redux { using type = std::tuple<>; }; template struct data_server_redux> { using type = std::tuple>...>; }; } }