如何编写一个接受 && 和 const& 两者的模板函数?
How to write a template function accepting && and const& both?
例如
template<typename T> void f(T&& t) {}
template<typename T> void f(T const& t) {}
当我呼叫时
int i;
f(i); // call f(T&&) which I expect to call f(T const&), how to solve it?
f(10); // call f(T&&), that is fine
这是一种方式:
#include <type_traits>
template<typename T>
typename std::enable_if< !std::is_lvalue_reference<T>::value >::type
f(T&& t) {}
template<typename T> void f(T const& t) {}
另一种可能性是标签调度:
template<typename T>
void f_(const T&, std::true_type) { std::cout << "const T&n"; }
template<typename T>
void f_(T&&, std::false_type) { std::cout << "T&&n"; }
template<typename T>
void f(T&& t)
{
f_(std::forward<T>(t), std::is_lvalue_reference<T>{} );
}
另一种选择是:
template<typename T>
struct f_caller
{
void operator () (T&& ) { std::cout << "T&&" << std::endl; }
void operator () (T const& ) { std::cout << "const T&" << std::endl; }
};
template <typename T>
void f(T&& t)
{
f_caller<typename std::decay<T>::type>()(std::forward<T>(t));
}
实例
相关文章:
- 在 const 函数中通过引用和指针返回之间的区别
- 使用 std::string () const 函数启动线程或未来
- 如果我在 const 函数上使用指针,我可以返回什么?
- 为什么 const 函数返回左值而不是右值?
- 当我调用 main 中使用 const 对象的 const 函数时,不断出现错误
- 在 const 对象上调用非 const 函数
- 析构函数是否可以在 const 对象上调用非 const 函数
- C/C++ 如何在一次函数调用中交出 const 函数指针或简单指针
- 为什么我可以在C 11中使用const函数修改类
- 防止const函数被调用非const对象
- 如果C 中的支架重载运算符被声明为const函数
- C++:防止在 const 函数中更改指针的值
- 从const函数返回非const属性参考
- 调用指针参数从const函数指向的对象的操作员
- 在const函数中调用非CONST成员的非const函数
- 无法将 const 数据类型传递到非 const 函数中
- 这是检查 const 函数(如果是否创建某些内容)的更好方法
- 在 const 函数中从地图中未经选中读取
- 编译器不会为 "const" 和"not-const"函数给出不明确的错误吗
- 通过const函数中的参数索引返回std :: map的值