如何在任何嵌套级别替换模板中的类型?

How can I replace a type in a template at any level of nesting?

提问人:Guillaume Racicot 提问时间:8/1/2023 最后编辑:Guillaume Racicot 更新时间:8/1/2023 访问量:66

问:

我有一个名为 .我想用模板元函数替换该类型。我希望模板元函数非常复杂,所以让我们称它为。the_badthe_goodthe_ugly

我的问题是可以嵌套在其他模板中,并且我想保持其他模板和参数不变。下面是我的意思的一个例子,其中不完整的实现:the_badthe_ugly

struct the_good {};
struct the_bad {};

template<typename T>
struct the_ugly_impl {
    using type = T;
};

template<>
struct the_ugly_impl<the_bad> {
    using type = the_good;
};

template<typename T>
using the_ugly = typename the_ugly_impl<T>::type;

// passes, yay!
static_assert(std::same_as<the_good, the_ugly<the_bad>>);

// doesn't pass
static_assert(std::same_as<std::vector<the_good>, the_ugly<std::vector<the_bad>>>);

// doesn't pass
static_assert(std::same_as<std::list<std::vector<the_good>>, the_ugly<std::list<std::vector<the_bad>>>>);

我该如何修复,以便它替换为任何嵌套级别,同时保持所有其他模板和其他模板参数保持不变?the_uglythe_badthe_good

C++ C++20 模板元编程

评论

0赞 Marek R 8/1/2023
您需要额外的专业化来处理嵌套类型。
1赞 StoryTeller - Unslander Monica 8/1/2023
真诚地?我会这样做 (1) 等待反思工作组来做一些事情。(2)编写一个使用适当反射的通用实用程序。(3) ????(4)利润。
0赞 Guillaume Racicot 8/1/2023
@StoryTeller-UnslanderMonica 即使反射出来,我的代码严格来说也是 C++20,并且可能会保持一段时间。我在这里问是因为我需要当前技术的帮助来解决这个问题,而不是从现在开始的 10 到 20 年内。在这一点上,我不指望反思会出来,即使它出来了,很可能那时我甚至不会在我的项目中工作。
2赞 Sam Varshavchik 8/1/2023
实际上,在嵌套类型的情况下,这并不太复杂。showstopper 将是非类型模板参数。就像 std::array 一样。我认为我们还没有完全到那一步......
1赞 Caleth 8/2/2023
@SamVarshavchik TS 在 C++ 中进行反思,而不仅仅是运行时内省

答:

5赞 Barry 8/1/2023 #1

您只需要处理模板案例,并递归调用自身:

template<typename T>
struct the_ugly_impl {
    using type = T;
};

template<typename T>
using the_ugly = typename the_ugly_impl<T>::type;

template<>
struct the_ugly_impl<the_bad> {
    using type = the_good;
};

template <template <typename...> class L, typename... Ts>
struct the_ugly_impl<L<Ts...>> {
    using type = L<the_ugly<Ts>...>;
};

评论

2赞 StoryTeller - Unslander Monica 8/1/2023
非类型模板参数已加入聊天:(无论如何都要升级
2赞 Guillaume Racicot 8/1/2023
@StoryTeller-诽谤莫妮卡:是的,我有点明白你的意思了。我想那会的。我可以处理一些常见的情况,然后收工