【问题标题】:Type deduction of reference_wrappers with Args带Args的reference_wrappers类型推演
【发布时间】:2021-01-11 04:14:53
【问题描述】:

我有一个模板函数:

template<class... Args>
void foo(Args&&... args)
{
    boo<std::decay_t<Args>...>(std::forward<Args>(args)...);
}

现在我想做的是像这样多次调用 foo 函数:

int value = 123;
const int& cr_value = value;
foo(value );
foo(std::cref(value ));

在第一种情况下我调用boo&lt;int&gt; 在第二种情况下调用boo&lt;std::const_reference_wrapper&lt;int&gt;&gt;。 有没有办法在不显式使用get函数包中的每个参数的情况下自动“取消引用”reference_wrapper? 这样做的原因是我想在第二种情况下调用boo&lt;const int&amp;&gt;,而不是boo&lt;std::const_reference_wrapper&lt;int&gt;&gt;

【问题讨论】:

    标签: c++ template-argument-deduction


    【解决方案1】:

    你可能会这样做:

    template <typename T> struct unwrap {
        using type = T;
    };
    template <typename T> struct unwrap<std::reference_wrapper<T>> {
        using type = T&;
    };
    
    template <typename T> using unwrap_t = typename unwrap<T>::type;
    
    template<class... Args>
    void foo(Args&&... args)
    {
        boo<unwrap_t<std::decay_t<Args>>...>(std::forward<Args>(args)...);
    }
    

    Demo.

    【讨论】:

    • 哇。模板的使用真是太棒了。从来没有想过模板类可以在内部有一个别名作为嵌套类型。
    • 这是type_traits的传统方式。
    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多