有没有办法 static_assert 类型 T 是Not在标题中的那一点完成?这个想法是,如果有人在不应该添加的地方添加#includes,就会出现编译错误。
有关的:如何编写“is_complete”模板?
使用该链接的答案,
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!");
不幸的是,这给出了“无效使用不完整类型”错误,d'oh。有没有办法断言否定?
这是一个使用基于表达式 SFINAE 的函数chris proposal它允许检查类型是否完整。
我的采用不需要包含,当缺少所需的参数时会出错(不可能隐藏参数),并且适用于 C++11 及以上版本。
template<typename T>
constexpr auto is_complete(int=0) -> decltype(!sizeof(T)) {
return true;
}
template<typename T>
constexpr bool is_complete(...) {return false;}
和一个测试套件:
struct S;
bool xyz() {return is_complete<S>(0);}
struct S{};
#include <iostream>
int main() {
std::cout << is_complete<int>(0) << '\n';
std::cout << xyz() << '\n';
std::cout << is_complete<S>(0);
}
Output:
1
0
1
See live on coliru
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)