gpt4 book ai didi

c++ - 通用模板模板参数

转载 作者:太空狗 更新时间:2023-10-29 20:34:43 27 4
gpt4 key购买 nike

受够了“统一初始化”不是很统一,我决定写一个通用的 construct()如果类型是聚合,则使用聚合初始化的包装器,否则直接初始化:

template <class T, class... Args,
std::enable_if_t<std::is_aggregate_v<T>, int> = 0>
constexpr auto construct(Args&&... args)
-> decltype(T{std::forward<Args>(args)...})
{
return T{std::forward<Args>(args)...};
}

template <class T, class... Args>
constexpr auto construct(Args&&... args)
-> decltype(T(std::forward<Args>(args)...))
{
return T(std::forward<Args>(args)...);
}

这很好用:

template <class T, class U>
struct my_pair { T first; U second; };

auto p = construct<my_pair<int, float>>(1, 3.14f);
auto v = construct<std::vector<int>>(5, 0);

我想扩展它以使用构造函数的模板参数推导。所以我添加了另一对重载:

template <template <class...> class T, // <-- (1) 
class... Args,
class A = decltype(T{std::declval<Args>()...}),
std::enable_if_t<std::is_aggregate_v<A>, int> = 0>
constexpr auto construct(Args&&... args)
-> decltype(T{std::forward<Args>(args)...})
{
return T{std::forward<Args>(args)...};
}

template <template <class...> class T, // <-- (1)
class... Args>
constexpr auto construct(Args&&... args)
-> decltype(T(std::forward<Args>(args)...))
{
return T(std::forward<Args>(args)...);
}

也许令人惊讶(至少对我而言),这适用于简单的情况:

// deduction guide for my_pair
template <class T, class U> my_pair(T&&, U&&) -> my_pair<T, U>;

auto p = construct<my_pair>(1, 3.14f); // my_pair<int, float>
auto v = construct<std::vector>(5, 0); // vector of 5 ints

不幸的是,这在尝试调用时失败了

auto a = construct<std::array>(1, 2, 3); // No matching call to construct()

因为std::array有一个非类型模板参数,所以它不匹配 template <class...> class T (1) 处的模板模板参数。

所以我的问题是,有没有一种方法可以在 (1) 处制定参数,使其可以接受任何类模板名称,而不管其类模板的种类(类型或非类型)模板参数?

最佳答案

不幸的是,没有正确的方法可以做到不重复代码。 C++17新增的“auto as template parameter”只支持非类型模板参数

我认为这可行的唯一方法是使用代码生成器生成固定数量的 autoclass 排列。例如

template <
template <class, auto...> class T,
class... Args>
constexpr auto construct(Args&&... args) // ...

template <
template <class, auto, class...> class T,
class... Args>
constexpr auto construct(Args&&... args) // ...

template <
template <auto, class, auto...> class T,
class... Args>
constexpr auto construct(Args&&... args) // ...

template <
template <auto, class, auto, class...> class T,
class... Args>
constexpr auto construct(Args&&... args) // ...

template <
template <auto, class, auto, class, auto...> class T,
class... Args>
constexpr auto construct(Args&&... args) // ...

// and so on...

live example on wandbox

听起来你对提案有个好主意......

关于c++ - 通用模板模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46812945/

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