c++ - 非限定或指针/引用类型的特征
问题描述
我正在执行检查以查看类型是否被剥夺了任何资格:
template <class T>
struct is_plain : std::integral_constant<
bool,
std::is_same_v<T, std::decay_t<T>> // *
>;
中的逻辑std::is_same_v<T, std::decay_t<T>>
,即检查一个类型是否删除了任何decay
可以删除的东西,是否可以作为标准特征使用?
如果没有,我的实现是否遗漏了什么?我只想确保(在静态断言中)不会将指针或引用传递给某个类。
更新
正如@NathanOliver 所指出的,decay
不会删除指针(如果这是一个词),所以decay_t<int*>==int*
. 我没有意识到这一点,所以除了描述之外,我还想从类型中删除指针。
解决方案
这有点冗长,但它应该涵盖所有的情况。和
template<typename T>
constexpr auto is_plain_v = !(std::is_function_v<T> || std::is_pointer_v<T> ||
std::is_lvalue_reference_v<T> || std::is_rvalue_reference_v<T> ||
std::is_array_v<T> || std::is_member_object_pointer_v<T> ||
std::is_member_function_pointer_v<T> || std::is_const_v<T> ||
std::is_volatile_v<T>);
并使用驱动程序
struct Test { void foo(int) {} };
int main ()
{
std::cout << std::boolalpha
<< is_plain_v<int> << '\n'
<< is_plain_v<const int> << '\n'
<< is_plain_v<int&> << '\n'
<< is_plain_v<int&&> << '\n'
<< is_plain_v<const int&> << '\n'
<< is_plain_v<int[2][2]> << '\n'
<< is_plain_v<int(int)> << '\n'
<< is_plain_v<int(*)(int)> << '\n'
<< is_plain_v<void (Test::*)(int)> << '\n';
}
它输出
true
false
false
false
false
false
false
false
false
推荐阅读
- css - 具有行跨度的 td 中 css 类的奇怪行为(Angular)
- python - 有没有办法排除在 IntelliSense 中自动完成的参数?
- javascript - React - 2 个相互依赖的输入字段 - 无限循环
- python - Python 3 等效于 string.maketrans('','')
- swagger-ui - 使用 swagger UI 进行生产使用
- kubernetes - GKE 工作负载身份 PermissionDenied
- php - 添加https后无法在moodle中查看相应的标签图标
- javascript - 如何遍历依赖于 API 调用的数组
- pipedrive-api - 查询笔记评论的端点
- ios - 在 iOS 源代码注释中包含敏感信息是不好的做法吗?