gpt4 book ai didi

c++ - 指定默认模板

转载 作者:太空狗 更新时间:2023-10-29 21:12:38 26 4
gpt4 key购买 nike

考虑一下:

template <typename Pack, template <typename...> class = std::tuple> struct foo;

template <template <typename...> class P, typename... Ts, template <typename...> class Q>
struct foo<P<Ts...>, Q> {
using type = Q<P<Ts>...>;
};

我已经将默认模板放在 typedef 中为 std::tuple 以进行编译,但我真正想要的是默认模板为 P ,而且我不知道有任何允许这样做的语法。我使 typedef 保持简单以说明这一点,即试图将 P 作为默认模板。所以我想出了以下看起来有点丑陋的解决方法:

template <typename Pack, template <typename...> class...> struct foo;

template <template <typename...> class P, typename... Ts, template <typename...> class Q>
struct foo<P<Ts...>, Q> {
using type = Q<P<Ts>...>;
};

template <template <typename...> class P, typename... Ts>
struct foo<P<Ts...>> {
using type = P<P<Ts>...>;
};

还有比这更好的方法吗?也许是我不知道的一些 c++17 语法?

最佳答案

在这种情况下,using(结合template)是你的 friend 。

你需要一个类型特征来提取Pack中的容器,例如

template <typename>
struct bar;

template <template <typename...> class P, typename ... Ts>
struct bar<P<Ts...>>
{
template <typename ... Us>
using templ_type = P<Us...>;
};

因此您可以从 Pack 中提取第二个模板参数的默认值,如下所示

template <typename Pack,
template <typename...> class = bar<Pack>::template templ_type>
struct foo;

下面是一个完整的编译示例

#include <type_traits>

template <typename ...>
struct baz
{ };

template <typename>
struct bar;

template <template <typename...> class P, typename ... Ts>
struct bar<P<Ts...>>
{
template <typename ... Us>
using templ_type = P<Us...>;
};

template <typename Pack,
template <typename...> class = bar<Pack>::template templ_type>
struct foo;

template <template <typename...> class P, typename... Ts,
template <typename...> class Q>
struct foo<P<Ts...>, Q>
{ using type = Q<P<Ts>...>; };

int main()
{
foo<baz<short, int, long>> f0;

static_assert( std::is_same<decltype(f0)::type,
baz<baz<short>, baz<int>, baz<long>>>{}, "!" );
}

关于c++ - 指定默认模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46676866/

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