c++ - 如何检测类型类型别名?
问题描述
我可以使用以下模板检查来检测成员:
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
告诉我一个类是否有一个 using 定义。即可以检测到某个类(例如test
)具有某种类型的使用定义的东西。即类似的东西
if constexpr(hasSomeType<Test>)
{
//do something
}
这在 c++17 中可行吗?如何?
解决方案
您可以使用与数据成员检测相同的方法来做到这一点。而不是使用数据成员,只需使用成员类型和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; }) {
}
推荐阅读
- javascript - TextArea 不会滚动到最大底部
- r - 如何为序列设置长度?
- java - 在 Filechooser 中获取字符串路径
- typescript - TypeORM - connectionNotFoundError
- java - Java获取包含至少一个文件的文件夹列表
- php - Shopify 允许将任意数量的单位添加到购物车
- r - 如何在循环内获取不同模型的摘要?
- apache-zookeeper - Mesos 从站是否需要与 Mesos 主站联系?
- angular - 错误类型错误:无法读取模板中未定义的属性“文件”
- mysql - 如何从数据库中获取特定的 api?