【问题标题】:convert tuple types to decay types将元组类型转换为衰减类型
【发布时间】:2020-07-12 00:09:08
【问题描述】:

我正在使用 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&lt;???&gt;,但我不知道如何将T 中的类型获取到模板包中。请注意,我假设 T 在这里是默认可构造的。

【问题讨论】:

    标签: c++ c++17 stdtuple


    【解决方案1】:

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

    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>>, "!");
     }
    

    【讨论】:

    • 太完美了。正是我想要的。我忘记了你可以只声明函数而不定义它,因为我们实际上并没有调用它。谢谢!
    【解决方案2】:

    对于Boost.Mp11,这是一个简短的单行(一如既往):

    template <typename Tuple>
    using decayed_tuple = mp_transform<std::decay_t, Tuple>;
    

    【讨论】:

    • 哇,太棒了,谢谢。我想只使用std:: 来实现它,但这是一个很好的答案。也许我会偷看源头。
    猜你喜欢
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多