imperfect C++一书中提到了must_have_base,大致代码如下:
template<typename Sub, typename Fat> class must_have_base { public: ~must_have_base() { void (*pd) (Sub*, Fat*) = constraint; } private: static void constraint(Sub* sub, Fat * fat) { fat = sub; } };
主要思想就是将运行时候可能出现的问题进行约束,让这些问题提早的在编译阶段进行暴露,而又不会引入运行时候的开销。
本书的作者也提到上面这个约束,其实严格上来讲,包含了两种类型相同的时候的情况,那么他也提到了应该进行修改,如果两个类型相同的时候,让编译器报错,遗憾的是,作者并没有提出解决方案,希望大家集思广益,看如何实现这一要求呢?
简单点,加个特化<preclass="brush:cpp;toolbar:true;auto-links:false;">template<typenameSub,typenameFat>classmust_have_base{public:~must_have_base(){void(pd)(Sub,Fat*)=constraint;}private:staticvoidconstraint(Subsub,Fatfat){fat=sub;}};template<typenameSingle>classmust_have_base<Single,Single>{public:~must_have_base(){Singlep=(base_and_sub_must_have_different_type)0;}private:structbase_and_sub_must_have_different_type{};};
然后你就可以这样
<preclass="brush:cpp;toolbar:true;auto-links:false;">structBase{};structSub:publicBase{};structNotSub{};must_have_base<Sub,Base>test1;must_have_base<NotSub,Base>test2;//这里会有编译错误must_have_base<Sub,Sub>test3;//这里会有编译错误版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。