我创建了一个帮助类,通过模板构建一个自定义类,这个自定义类必须从某个类继承,我可以使用std :: is_base_of来检查它.
但是,我还需要检查一下这个继承是否公开,这怎么可以实现呢?
作为参考,这里是一个剥离版本的类,我有std :: is_base_of在那里.
template<class CustomSink> class Sink { static_assert(std::is_base_of<BaseSink,CustomSink>::value,"CustomSink must derive from BaseSink"); //Some static assert here to check if custom sink has publicly inherited BaseSink //static_assert(is_public..... public: template<class... Args> Sink(Args&&... args) { } ~Sink() { } };
解决方法
据我所知,公共继承是唯一可以执行隐式指针转换的情况(通过重载运算符可以实现参考转换).
template <class T> std::true_type is_public_base_of_impl(T*); template <class T> std::false_type is_public_base_of_impl(...); template <class B,class D> using is_public_base_of = decltype(is_public_base_of_impl<B>(std::declval<D*>()));