gpt4 book ai didi

c++ - 在模板参数中查找第一个非空子类型

转载 作者:行者123 更新时间:2023-11-30 04:49:33 27 4
gpt4 key购买 nike

我正在尝试编写一个 C++ 元函数,它为我提供的模板参数返回第一个非空子类型。

例如:

struct I { using subtype = int; };
struct D { using subtype = double; };
struct E { using subtype = empty ; };

我正在努力实现:

static_assert(std::is_same<int, first_non_empty_subtype<E,E,I>>::value, "the first non-empty subtype should be 'int'");
static_assert(std::is_same<double, first_non_empty_subtype<E,D,I>>::value, "the first non-empty subtype should be 'double'");
static_assert(std::is_same<empty, first_non_empty_subtype<E,E,E>>::value, "since all subtypes are empty, the result is empty");

我最初的想法是将 std::conditional_t 与模板递归一起使用:

template <typename T, typename ...Ts>
using first_non_empty_subtype = std::conditional_t<
!std::is_empty<typename T::subtype>::value,
typename T::subtype,
first_non_empty_subtype<Ts...>>::type

但是,我并不完全熟悉为类型别名实现模板递归。

有人能帮我指出解决这个问题的正确方向吗?

谢谢!

最佳答案

我建议如下

// ground case: no more types, so empty
template <typename ...>
struct fnes_helper
{ using type = empty; };

// the first type is T and isn't empy; so T
template <typename T, typename ... Ts>
struct fnes_helper<T, Ts...>
{ using type = T; };

// the first type is empty; so recursion
template <typename ... Ts>
struct fnes_helper<empty, Ts...> : public fnes_helper<Ts...>
{ };

template <typename ... Ts>
using first_non_empty_subtype
= typename fnes_helper<typename Ts::subtype...>::type;

观察 fnes_helper 更专业的版本是第一个位置为 empty 类型的版本,在这种情况下使用的版本也是如此。遵循其他特化,第一个位置具有通用 T 类型的特化,最后我们有在其他情况下选择的主要版本,因此类型列表为空。

还记得在 static_assert()< 中的 std::is_same 之后添加 {}::value/ 测试

static_assert(std::is_same<int, first_non_empty_subtype<E,E,I>>{},
"the first non-empty subtype should be 'int'");
static_assert(std::is_same<double, first_non_empty_subtype<E,D,I>>{},
"the first non-empty subtype should be 'double'");
static_assert(std::is_same<empty, first_non_empty_subtype<E,E,E>>{},
"since all subtypes are empty, the result is empty");

关于c++ - 在模板参数中查找第一个非空子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55362165/

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