首页 > 解决方案 > 非限定或指针/引用类型的特征

问题描述

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

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*. 我没有意识到这一点,所以除了描述之外,我还想从类型中删除指针

标签: c++template-meta-programming

解决方案


这有点冗长,但它应该涵盖所有的情况。和

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

推荐阅读