c++ - 如何在编译时检测 C++ 中的 std::reference_wrapper

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

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

最佳答案

你可以做一个特征来判断一个类型是否是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

关于c++ - 如何在编译时检测 C++ 中的 std::reference_wrapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40430692/

相关文章:

c++ - 使用 STL 映射时,模板参数的数量错误?

c++ - 如何在 C++ 中调用 LsaRemoveAccountRights

c++ - 如何使用 boost-range 在函数中封装自定义迭代器

c++ - 在文件中写入退格键

c++ - 如何为我的模板类添加 std::swap?

c++ - 如何将 Unicode 字符串连接成字符串以传递给 mysql 调用

c++ - 检查我们是否有 const 类型

c++ - 我需要用nullptr初始化吗?

c++ - 我应该如何存储从文件中获取的这些信息?

c++ - std::map<t1, t2>::erase(iterator position) 的工作?