所以我理解var在C#中使用是有意义的,因为你有编译器派生的匿名类型.C++似乎没有这个功能(除非我错了),那么拥有一个auto关键字有什么意义呢?
(与C#不同,它有点酷,auto适用于成员/全局变量,我觉得这很酷,但似乎不足以证明它的存在).
Rap*_*ptz 33
auto 当涉及到泛型编程并为程序员节省一些打字时,它有很多用途.
例如,考虑一下.你愿意输入:
std::unique_ptr<name::long_type::goes_here> g =
std::make_unique<name::long_type::goes_here>(1,2,3,4)
Run Code Online (Sandbox Code Playgroud)
要么:
auto g = std::make_unique<name::long_type::goes_here>(1,2,3,4)
Run Code Online (Sandbox Code Playgroud)
是的,它们都很长但我们知道返回类型并再次指定它有点麻烦.这也适用于迭代器:
for(auto i = vec.begin(); ...)
Run Code Online (Sandbox Code Playgroud)
VS:
for(std::vector<type>::iterator i = vev.begin(); ...)
Run Code Online (Sandbox Code Playgroud)
它在泛型编程中的用途也是为了找出一个函数的返回类型,或者如果你正在做一些你不知道类型的通用算法.
例如,考虑一个非常基本的例子.
template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {
return t + u;
}
Run Code Online (Sandbox Code Playgroud)
这允许编译器找出添加操作的类型,而不是我们试图自己弄清楚它.请注意,在C++ 14中,您可以省略尾随返回类型.它在泛型编程中的用途也不止于此.如果我们想使用任何类型的容器作为算法的包装函数,我们可以使用auto它来帮助我们.例如:
template<class Cont>
void my_sort(Cont&& cont) {
using std::begin;
auto first = begin(std::forward<Cont>(cont));
// work with the iterators here
}
Run Code Online (Sandbox Code Playgroud)
在将来(C++ 14)中,auto也可用于制作多态lambda,例如:
[](auto a) { return a + 4; }
Run Code Online (Sandbox Code Playgroud)
哪个也很有用.
Yak*_*ont 15
auto在C++ 中有许多用途
匿名函数对象,也就是闭包,也就是lambda实例. auto是存储它们的唯一方法.类型也可以从这些类型和背面类型中生成,无限制地生成.
C++可以具有相当复杂的类型,例如非变异迭代器的类型,它使用自定义分配器和散列函数的无序映射. typedef可以减轻这一点,但m.begin()具有特定名称的类型不具有信息性:foo_iterator it =具有意义auto foo_iterator =,并且auto其他地方不需要样板.
返回类型推导使用auto关键字,这是执行某些template功能所必需的,没有大量的特征样板.消除样板是一个常见的主题:C++的健壮类型系统意味着类型可以携带大量信息,并且在每次使用时对其进行编码都会适得其反.
在一些ducktype template代码中,推导变量类型的工作与编码变量值的工作大致相同,并且在结构上几乎相同,有时候字面上:decltype(long expression) x = long expression;. auto消除了重复.
最后在C++ 1y中,类型演绎lambdas auto用来表示参数是推导出的.重量轻template.谈到扩展到非lambdas也在臭鼬工作.
HEre是一个真实的例子,我不能,不使用auto
我试图在C++中执行switch类型语句,其中返回类型是特定于实现的,并且无法轻松声明.所以使用'auto'可能是解决地图声明类型查找的正确方法.
auto foo = boost::bind(&VegaFactory::load_commodity_one_leg,this,conn,_1);
std::map<std::string,decltype(foo)> methods;
methods.insert(std::make_pair("FOO",commodityOneLeg));
auto f = methods.find(bar);
// Call f here
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2211 次 |
| 最近记录: |