imperfect C++一书中提到的must_have_base

machunleilei 发布于 2013/12/12 17:10
阅读 382
收藏 1
c++

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

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

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



加载中
0
Windoze
Windoze
简单点,加个特化
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;
    }
};


template<typename Single>
class must_have_base<Single, Single> {
public:
    ~must_have_base() {
        Single *p=(base_and_sub_must_have_different_type *)0;
    }
private:
    struct base_and_sub_must_have_different_type {};
};

然后你就可以这样

struct Base {};
struct Sub : public Base {};
struct NotSub {};

must_have_base<Sub, Base> test1;
must_have_base<NotSub, Base> test2;   // 这里会有编译错误
must_have_base<Sub, Sub> test3;       // 这里会有编译错误



这种方法可以凑合一下,但是的确有点难看, 鉴于C++11中的concept被毙掉了, 要想彻底解决这个问题,只好等C++14,看看concept lite能不能死而复生



返回顶部
顶部