【问题标题】:How to detect std::reference_wrapper in C++ at compile time如何在编译时检测 C++ 中的 std::reference_wrapper
【发布时间】:2017-03-18 18:15:37
【问题描述】:

假设我们有一些可变参数模板并且需要以不同的方式处理std::reference_wrapper 参数。 我们怎样才能做到这一点?

【问题讨论】:

  • 为什么需要这样做?
  • 您希望以何种方式区别对待它们?打印时打印os << "chicken",而在其他类型上使用os << t?将reference_wrapper<T>&& 视为T&,同时对它们调用.get()

标签: c++ c++11 stl c++14 reference-wrapper


【解决方案1】:

你可以创建一个特征来判断一个类型是否是reference_wrapper

template<typename T>
struct is_reference_wrapper : false_type {};

template<typename T>
struct is_reference_wrapper<reference_wrapper<T>> : true_type{};

那你就可以用它来消歧义了:

template<typename T>
void do_stuff(T&& t, false_type)
{
    cout << "Normal: " << t << endl;
}

template<typename T>
void do_stuff(T&& ref, true_type)
{
    cout << "Ref: " << ref.get() << endl;
}

template<typename... Ts>
void foo(Ts&&... ts)
{
    [[maybe_unused]] int arr[] = {
        (do_stuff(forward<Ts>(ts), is_reference_wrapper<decay_t<Ts>>{}), 0)...
    };
}

demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 2012-03-19
    相关资源
    最近更新 更多