在标准 C++(和 C ),使用参数必须明确的指出其类型。然而,随着模版类型的出现以及模板元编程的技巧,某物的类型,特别是函数定义明确的回返类型,就不容易表示。在这样的情况下,将中间结果存储于参数是件困难的事,可能会需要知道特定的元编程程序库的内部情况。
比如, 对map的遍历, 需要知道 iter的完整类型std::map<int,string>::iterator
std::map<int,string> m;
std::pair<int, string> p(1, "1");
m.insert(p);
for(std::map<int,string>::const_iterator iter = m.begin();
iter != m.end(); iter++){
int key = iter->first;
string value = iterhttp://write.blog.csdn.net/postedit/12318621->second;
}
C++11 提供两种方法缓解上述所遇到的困难.
auto
有被明确初始化的参数可以使用 auto 关键字, 这会依据该初始化子具体类型产生参数.
以上可以修改为:
auto iter = m.begin()
编译器可以根据初始化参数来确定真正类型:
//std::binder2nd<std::less<int>> pred = std::bind2nd(std::less<int>(), 100); auto pred = std::bind2nd(std::less<int>(), 100); //int v = 5;
auto v = 5;
除此之外,decltype 能够被用来在编译期决定一个表示式的类型。
decltype
decltype(m.begin()) iter = m.begin()
int v;
decltype(v) v2 = 5;
decltype 和 auto 一起使用会更为有用,因为 auto 参数的类型只有编译器知道。然而 decltype 对于那些大量运用运算符重载和特化的类型的代码的表示也非常有用
#include <vector>
int main()
{
const std::vector<int> v(1);
auto a = v[0];// a为int 型別
decltype(v[0]) b = 0; // b为const int& 型別,即
// std::vector<int>::operator[](size_type)const 的回返型別
auto c = 0; // c 为 int 型別
auto d = c; // d 为 int 型別
decltype(c) e; // e 为 int 型別,c 尸体的型別
decltype((c)) f = e; // f 为 int& 型別,因为(c)是左值
decltype(0) g; // g为int型別,因为0是右值
}