gpt4 book ai didi

c++ - 检查类 T 是否具有带有 void_t 的成员类型 Member

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:32 28 4
gpt4 key购买 nike

代码如下:

template<typename, typename, typename = void>
struct has_member_type : false_type {};

template<typename T, typename Member>
struct has_member_type<T, Member, void_t<typename T::Member>> : true_type {};

struct foo { using bar = int; };

int main()
{
std::cout << has_member_type<foo, typename foo::bar>::value;
}

我正在尝试检查 foo 是否有 bar 类型的成员。如果实现不指定类型成员的名称,它工作正常,但这样名称被硬编码到实现中,这对我不起作用。

据说重复的问题并不能回答我的问题。正如我在上面的段落中解释的那样,当类型被硬编码到实现中时它很好,但是当我从外部指定类型时我无法让它工作(这是特定问题)。代码编译正常,但产生错误的结果。

最佳答案

您的代码不起作用,因为 typename foo::bar 只是直接解析为 int,而不是传入可用于 SFINAE 的某些结构。

一个可能的解决方案是制作一个别名模板,它将告诉您 T::bar 的类型是什么,然后将其传递给您的检查器。这就是std::experimental::is_detected做。这是一个简化版本,与您已有的版本很接近*:

template<typename, template <typename> class, typename = void>
struct is_detected : false_type {};

template<typename T, template <typename> class Op>
struct is_detected<T, Op, void_t<Op<T>>> : true_type {};

然后编写要检测的别名模板:

template <typename T> using bar_t = typename T::bar;

用法是这样的:

is_detected <foo, bar_t>::value

*:我将模板参数与您的示例代码中的模板参数保持一致,以便您可以轻松进行比较。在更通用的上下文中翻转它们以便使运算符参数可变更好。它还可以让您更轻松地迁移到可用的 std::experimental::is_detected

关于c++ - 检查类 T 是否具有带有 void_t 的成员类型 Member,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34903845/

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