非限定或 pointer/reference 类型的特征
Trait for non qualified or pointer/reference types
我正在执行检查以查看类型是否被剥夺了任何资格:
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
会去除的任何东西?
如果不是,我的实现是否遗漏了什么?我只是想确保(在静态断言中)不会将指针或引用传递给某些 class.
更新
正如@NathanOliver 所指出的,decay
不会删除指针(如果这是一个词),所以 decay_t<int*>==int*
。我不知道这一点,所以对描述的补充是 我也想从类型中删除指针。
你的不适用于数组。有一个非常相似的标准特征:
std::is_same_v<T, std::remove_cvref_t<T>>
这有点冗长,但它应该涵盖所有存在的情况。有
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
我正在执行检查以查看类型是否被剥夺了任何资格:
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
会去除的任何东西?
如果不是,我的实现是否遗漏了什么?我只是想确保(在静态断言中)不会将指针或引用传递给某些 class.
更新
正如@NathanOliver 所指出的,decay
不会删除指针(如果这是一个词),所以 decay_t<int*>==int*
。我不知道这一点,所以对描述的补充是 我也想从类型中删除指针。
你的不适用于数组。有一个非常相似的标准特征:
std::is_same_v<T, std::remove_cvref_t<T>>
这有点冗长,但它应该涵盖所有存在的情况。有
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