更具体地说,假设我有一个带有参数A
和B
的类模板,如果B不是源自,那么我希望编译错误(当模板被实例化时)甲
template<class A, class B>
class Foo
{
// static_assert(B is derived from A)
};
答案 0 :(得分:10)
之前已经问了很多次,但是这很简单我会再次发布解决方案:
~Foo()
{
A* p = (B*)0; // B is required to be a subtype of A
}
答案 1 :(得分:9)
检查boost::is_base_of。如果您想自己尝试,请尝试使用this question中的Alexyey代码:
typedef char (&yes)[1];
typedef char (&no)[2];
template <typename B, typename D>
struct Host
{
operator B*() const;
operator D*();
};
template <typename B, typename D>
struct is_base_of
{
template <typename T>
static yes check(D*, T);
static no check(B*, int);
static const bool value = sizeof(check(Host<B,D>(), int())) == sizeof(yes);
};
修改即可。编写静态断言并不是什么大问题,但这里是:
#define STATIC_ASSERT(expr, msg) \
{ stat_assert<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }
template<int>
struct stat_assert;
template<>
struct stat_assert<true>{};
Edit2。如果您不知道如何合并这些内容,那么整个工作:Code on ideone
答案 2 :(得分:0)
您想要的是使用SFINAE规则制作模板的方法,该模板会在通常首选的情况下生成错误,但也可以以其他方式扩展。我相信提升可能已经有了一个模板就可以做到这一点。
其他人给了你一些代码。我将离开这个答案,因为它解释了代码是如何工作的。