非限定或 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