开发者社区> 问答> 正文

imperfect C++一书中提到的must_have_base?报错

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;
	}
};

主要思想就是将运行时候可能出现的问题进行约束,让这些问题提早的在编译阶段进行暴露,而又不会引入运行时候的开销。

本书的作者也提到上面这个约束,其实严格上来讲,包含了两种类型相同的时候的情况,那么他也提到了应该进行修改,如果两个类型相同的时候,让编译器报错,遗憾的是,作者并没有提出解决方案,希望大家集思广益,看如何实现这一要求呢?



展开
收起
爱吃鱼的程序员 2020-06-22 13:53:08 467 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    简单点,加个特化<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;//这里会有编译错误



    这种方法可以凑合一下,但是的确有点难看,<spanstyle="line-height:1.5;font-size:10pt;">鉴于C++11中的concept被毙掉了,<spanstyle="line-height:1.5;font-size:10pt;">要想彻底解决这个问题,只好等C++14,看看conceptlite能不能死而复生



    2020-06-22 13:53:27
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载