如何在编译时检测c++中的std::reference_wrapper
How to detect std::reference_wrapper in C++ at compile time
假设我们有一些可变模板,需要以不同的方式处理std::reference_wrapper
参数。我们如何才能做到这一点?
您可以创建一个trait来判断一个类型是否为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)...
};
}
演示相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::iterator::reference 必须是引用吗?
- 使用命名空间 std 时C++ "Reference to overloaded function"错误
- 尝试用C++编码时,我收到一长串错误,例如"/tmp/ccloHU4h.o:dad.cpp:(.text+0x5c): undefined reference to `std::cout'"
- nameless char[] to std::string& reference
- std::thread pass-by-reference调用复制构造函数
- 尝试使用 std::bind 重新分配 std::function 并得到错误"attempting to reference a deleted function"
- 错误"undefined reference to 'std::cout'"
- std::bind and rvalue reference
- 将 std::forward_as_tuple() 结果传递给可能从该对象的 rvalue-reference 成员移动的多个函数?
- 我继承自 std::iterator,但编译器无法识别'pointer'或'reference'
- 返回迭代器时"undefined reference to std::_Rb_tree_const_iterator"
- ' std::bitset::reference '赋值操作符
- "There is no "reference-to-member" type in C + +",std::bind 和 boost::bind 在同一条船上
- C++11 std::函数和std::reference包装器,用于对std::set进行排序
- 错误:从类型为"std::vector:<bool>:reference {aka std::_Bit_reference}"的右值初始化类型为"bool&"的非常量引用无效