静态断言模板类型名 T 不完整? [复制]

2023-11-21

有没有办法 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(使用前将#替换为@)

静态断言模板类型名 T 不完整? [复制] 的相关文章

随机推荐