gpt4 book ai didi

c++ - 检查是否存在嵌套类型别名并有条件地设置类型别名

转载 作者:行者123 更新时间:2023-12-05 09:27:54 29 4
gpt4 key购买 nike

我想知道如何根据输入参数中类型别名的存在有条件地设置类型别名。

struct a { using type = int; }

template <typename T> struct wrapper {
using inner_t = ???how???; // if T::type exists, use T::type, else T
};

static_assert(std::is_same<wrapper<int>::inner_t, int>, "expected int");
static_assert(std::is_same<wrapper<a>::inner_t, int>, "expected inner type: int");

一个天真的尝试就像std::conditional<std::is_class<T>, T::type, T>如果存在 type别名是先决条件,但远非安全,缺乏对类似 is_alias_present<T, type> 的检查.除此之外T::type可能并非所有类型都存在,从而导致编译器错误。

显然 std::experimental::is_detected看起来很有希望,但不幸的是现在不是一个选择。

不确定元编程库是否像 boost::mp11boost::hana是完成这项工作的好方法。

最佳答案

借助 C++20 概念

template<class T>
struct innter {
using type = T;
};

template<class T>
requires requires { typename T::type; }
struct innter<T> {
using type = T::type;
};

template <typename T>
struct wrapper {
using innter_t = innter<T>::type; // if T::type exists, use T::type, else T
};

在C++17中,可以使用void_t来检测T::type的有效性

#include <type_traits>

template<class T, class = void>
struct innter {
using type = T;
};

template<class T>
struct innter<T, std::void_t<typename T::type>> {
using type = typename T::type;
};

template <typename T>
struct wrapper {
using innter_t = typename innter<T>::type; // if T::type exists, use T::type, else T
};

Demo

关于c++ - 检查是否存在嵌套类型别名并有条件地设置类型别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71941270/

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