c++ - 静态断言模板类型名 T 不完整?

标签 c++ templates static-assert incomplete-type

<分区>

有没有办法 static_assert 类型 T 在 header 中的那个点完整?这个想法是,如果有人在不应该的地方添加#includes,就会出现编译错误。

相关:How to write `is_complete` template?

使用该链接的答案,

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。有没有办法断言否定?

最佳答案

这是一个使用基于 chris 的表达式 SFINAE 的函数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);
}

输出:

1
0
1

See live on coliru

关于c++ - 静态断言模板类型名 T 不完整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25796126/

相关文章:

c++ - 静态断言基指针 "equals"是派生指针

c++ - 使用 friend 关键字查找模板函数

c++ - 传递重载函数指针及其参数时的错误类型推导

c++ - C++ 17遍历参数包的子集

c++ - 为什么一个表达式是常量,而另一个不是?

c++ - 在不创建临时指针的情况下传递指向函数指针的指针

curly-braces - 您是否使用花括号进行额外的范围界定?

c++ - 使用 C++ 将 CPU 专用于在 1 个内核上运行您的进程

c++ - 如何使用 std::is_volatile?

c++ - static_assert 可以检查类型是否为 vector 吗?