赞
踩
template<typename T, typename U>
auto add(T x, U y) -> decltype(auto) //C++11时,-> decltype(x+y)
{
return x + y;
}
int main() {
cout << typeid(add(10, 40.44)).name() << endl; //输出double
return 0;
}
int main() {
vector<int> v = { 1, 2, 3, 4, 5 };
for (auto&& u : v)
cout << u << " ";
return 0;
}
void processValue(int& lvalue) { cout << "Processing lvalue: " << lvalue << endl; } void processValue(int&& rvalue) { cout << "Processing rvalue: " << rvalue << endl; } //使用完美转发的函数模板 //模板中&&不代表右值引用,而是万能引用,既能接收左值也能接收右值。 template<typename T> void forwarder(T&& arg) { processValue(forward<T>(arg)); } int main() { int x = 5; forwarder(x); // 输出:Processing lvalue: 5 forwarder(10); // 输出:Processing rvalue: 10 forwarder(move(x)); // 输出:Processing rvalue: 5 forwarder(static_cast<int&&>(x)); // 输出:Processing rvalue: 5 return 0; }
#include <iostream> #include <type_traits> //is_lvalue_reference_v #include <utility> //forward using namespace std; template<typename U,typename... T> void foo(U&& arg,T&&... args) { // 检查参数属性 if constexpr (is_lvalue_reference_v<U>) cout << "lvalue: " << arg << endl; else cout << "rvalue: " << arg << endl; // 如果还有参数,递归调用foo if constexpr (sizeof... (args) > 0) foo(forward<T>(args)...); } template<typename... T> void wrapper(T&&... arg) { foo(forward<T>(arg)...); //使用完美转发将参数包扔过去 } int main() { int x = 5; wrapper(x,move(x),3.4); // 输出:lvalue: 5, rvalue: 5,rvalue: 3.4 return 0; }
[capture] (parameters) mutable ->return-type {statement};
int main() { vector<int> nums = { 1, 2, 3, 4, 5 }; // 使用广义捕获和移动语义来捕获nums auto printFunc = [vec = move(nums)]() { for (auto num : vec) { cout << num << " "; } cout << std::endl; }; printFunc(); // 调用lambda函数 return 0; }
struct Adder { int operator()(int a, int b) const { return a + b; } }; int main() { Adder obj; cout << obj(2, 3) << endl; // 调用函数对象 auto add = [](int a,int b) {return a + b; }; cout << add(2, 3) << endl; //调用匿名函数对象 return 0; }
分析:函数对象(仿函数)是指可以像函数一样被调用的对象,它是重载()运算符的类或结构体,如这里的Adder。而lambda表达式可以定义匿名函数对象,如这里的add,同时也是闭包实例。
class Converter {
private:
short value;
public:
Converter(short value) : value(value) {}
Converter(int) = delete;
};
int main() {
int intValue = 10000;
Converter converter(intValue); //报错,防止了int强制向下转换成short
return 0;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。