将元组类型转换为衰减类型

西班牙口香糖

我在玩与C ++ 17,我有一个std::tupleconst &T类型。例如:

template <typename... members>
auto make_cr_tuple(members const &...args) -> decltype(auto) {
    return std::make_tuple(std::cref(args)...);
}

int main() {
    std::string s;
    int i = 0;
    auto crt = make_cr_tuple(s, i); // std::tuple<const std::string &, const int &>
}

我想要一种声明每个值类型的元组,删除const和引用限定符的方法。例如,也许是这样的:

    using decayed = decayed_tuple<decltype(crt)>::type

我想我可以使用类似的方法,但这还不够。

template <typename T>
struct decayed_tuple {
    using type = decltype(std::apply(std::make_tuple, T{}));
};

显然,这是行不通的,因为这make_tuple是一个未解决的重载函数。

我确实需要std::make_tuple<???>,但我不知道如何将类型从T模板包中获取。请注意,我假设T这里是默认可构造的。

最高66

也许您可以如下声明(不需要定义)一个函数

template <typename ... Ts>
constexpr auto decay_types (std::tuple<Ts...> const &)
   -> std::tuple<std::remove_cv_t<std::remove_reference_t<Ts>>...>;

并通过std::declval()使用它decltype()

也许您也可以添加using别名以简化工作

template <typename T>
using decay_tuple = decltype(decay_types(std::declval<T>()));

一个完整的例子

#include <tuple>
#include <type_traits>

template <typename ... Ts>
constexpr auto decay_types (std::tuple<Ts...> const &)
   -> std::tuple<std::remove_cv_t<std::remove_reference_t<Ts>>...>;

template <typename T>
using decay_tuple = decltype(decay_types(std::declval<T>()));

int main()
 {
   using T1 = std::tuple<int const &, long const &, long long const &>;
   using T2 = decay_tuple<T1>;

   static_assert( std::is_same_v<T2, std::tuple<int, long, long long>>, "!");
 }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章