gpt4 book ai didi

c++ - 非限定或指针/引用类型的特征

转载 作者:行者123 更新时间:2023-12-04 01:02:12 25 4
gpt4 key购买 nike

我正在执行检查以查看类型是否被剥夺了任何资格:

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

关于c++ - 非限定或指针/引用类型的特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67907777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com