有没有一种方法可以在头文件中静态断言类型T在该点未完成?这个想法是,如果有人在不应该的地方添加#includes,就会产生编译错误。
使用该链接的答案,
namespace
{
template<class T, int discriminator>
struct is_complete {
static T & getT();
static char (& pass(T))[2];
static char pass(...);
static const bool value = sizeof(pass(getT()))==2;
};
}
#define IS_COMPLETE(X) is_complete<X,__COUNTER__>::value
class GType;
static_assert(!IS_COMPLETE(GType),"no cheating!");
不幸的是,这里出现了“无效使用不完整类型”的错误,唉。有没有一种方法来对否定进行断言?
declval
?http://coliru.stacked-crooked.com/a/d2987f9901270a48 - DeduplicatorS
更改为struct S {S(int){}};
,然后只需使用S{}
而不是std::declval<S>()
即可获得0
。std::declval
会给你一个右值引用,因此您不需要使用可能存在或不存在的构造函数。但是,是的,一开始所有这些都是完全不必要的,因为我很蠢,sizeof
可以用于类型。 - chris