ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 通用模板模板参数

2019-08-28 09:08:15  阅读:237  来源: 互联网

标签:template-templates c templates c17


厌倦了“统一初始化”不是非常统一,我决定编写一个泛型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有一个非类型模板参数,所以它与模板< class ...>不匹配(1)处的T类模板模板参数.

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

解决方法:

不幸的是,没有代码重复就没有正确的方法. C 17中新添加的“自动模板参数”仅支持非类型模板参数.

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

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

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

标签:template-templates,c,templates,c17
来源: https://codeday.me/bug/20190828/1750000.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有