gpt4 book ai didi

c++ - 如何检测类型别名?

转载 作者:行者123 更新时间:2023-12-01 14:39:11 26 4
gpt4 key购买 nike

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

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 定义。 IE。可以检测到某个类(例如 test)具有某种类型的 using 定义的东西。 IE。类似

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 {};

或者您可以使用 detection idiom :

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; }) {

}

Live example

关于c++ - 如何检测类型别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62430862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com