如何检测类型别名?

威廉

我可以使用以下模板检查来检测成员:

template <typename T, typename = void>
struct hasMember : std::false_type {};
template <typename T>
struct hasMember<T, decltype((void)T::member, void())> : std::true_type {};

例如:

class Test{
public:
   int member;
   using sometype = size_t; 
}

我可以做:

if constexpr(hasMember<Test>)
{
   //do something
}

现在假设我需要一个constexpr if告诉我类是否具有使用定义的。即可以检测到某个类(例如test)具有某种类型的使用定义的东西。即像

if constexpr(hasSomeType<Test>)
{
     //do something
} 

在c ++ 17中可能吗?怎么样?

纪尧姆·拉西科特(Guillaume Racicot)

您可以使用与数据成员检测相同的方法来执行此操作。代替使用数据成员,只需使用成员类型和void_t

template <typename T, typename = void>
struct hasSomeType : std::false_type {};

template <typename T>
struct hasSomeType<T, std::void_t<typename T::member_type>> : std::true_type {};

或者,您可以使用检测习惯用法

template<typename T>
using member_type_t = typename T::member_type;

您可以使用将任何表达式放在那里decltype

然后,使用别名执行检测:

if constexpr (is_detected<member_type_t, Test>) {
    // ...
}

当然,在C ++ 20中,所有这些都变成了衬套:

// requires a type
if constexpr (requires(Test) { typename Test::member_type; }) {

}

// requires a member
if constexpr (requires(Test t) { t.member; }) {

}

现场例子

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何创建类型别名

来自分类Dev

如何从类型别名确定类型?

来自分类Dev

如何从类型别名提取类型实参和类型参数引用其他类型别名?

来自分类Dev

如何从类型别名提取类型实参和类型参数引用其他类型别名?

来自分类Dev

类型别名错误

来自分类Dev

如何从类型别名使用原始类型的方法?

来自分类Dev

如何使用类型别名定义类型构造函数

来自分类Dev

类型别名与类型相同

来自分类Dev

如何在Go中强制转换为类型别名?

来自分类Dev

如何为固定大小的char数组创建类型别名?

来自分类Dev

如何使用mgo从文档中解组命名类型别名?

来自分类Dev

如何在Swift中“生成”闭包类型别名?

来自分类Dev

TypeScript如何为通用函数创建通用类型别名?

来自分类Dev

如何在TypeScript中声明全局类型别名?

来自分类Dev

如何在Flutter中创建类型别名?

来自分类Dev

Typeof / instanceof类型别名

来自分类Dev

std :: bind与类型别名

来自分类Dev

Rust中的类型别名

来自分类Dev

快速扩展类型别名

来自分类Dev

Scala中的类型别名

来自分类Dev

类型别名的伴随对象

来自分类Dev

条件类型别名定义

来自分类Dev

通用函数类型别名

来自分类Dev

键值对的TypeScript类型别名

来自分类Dev

TypeScript中的类型别名

来自分类Dev

Scala 中的类型别名

来自分类Dev

Scala类型标签和类型别名

来自分类Dev

从类型别名转换为原始类型

来自分类Dev

类型别名和类似类型