首先,我们先掌握C++11对泛型的支持:
decltype RTTI
int z = 0;
decltype(z) x = 100;
std::cout << typeid (x).name() << std::endl; // i int
float a = 1.0;
double b = 2.0;
decltype(a + b) c = a + b;
std::cout << typeid (c).name() << std::endl; // d double
class A {
};
typedef decltype(A{}) CA;
using CCA = decltype(A{});
std::vector<int> v{1, 2, 3, 4, 5};
{
// using iter = decltype(v)::iterator;
typedef decltype(v)::iterator iter;
for (iter it = v.begin(); it < v.end(); it++) {
std::cout << *it << std::endl;
}
}
// 对匿名类型的处理
struct {
short x;
short y;
} poses[100];
std::cout << sizeof (poses) << std::endl; // 400
typedef decltype(poses) POSES;
std::cout << sizeof (POSES) << std::endl; // 400
// 推导返回值
template<typename T1, typename T2>
void sum(const T1& t1, const T2& t2, decltype(t1 + t2) & result) {
result = t1 + t2;
}
double result = 0; // int result = 0; 无法通过
sum(i, d, result);
// 追踪返回类型
//错误
//template <typename T1, typename T2>
//decltype(t1 + t2) sum(const T1& t1, const T2& t2) {
// return t1 + t2;
//}
//正确,但不建议这样写
//template <typename T1, typename T2>
//auto sum(const T1& t1, const T2& t2) {
// return t1 + t2;
//}
//正确,建议这样写:追踪返回类型
template <typename T1, typename T2>
auto sum(const T1& t1, const T2 & t2) -> decltype(t1 + t2) {
return t1 + t2;
}
//-----------------
#include <type_traits>
#include <typeinfo>
typedef double (*func)();
std::result_of < func()>::type f; // 获得函数返回值的类型
decltype(typeid (f)) t = typeid (f);
std::cout << t.name() << std::endl; // d double
decltype(func()) x; // 函数类型,而非函数返回类型
std::cout << typeid (x).name() << std::endl; // PFdvE
面试题目如下:
int (*(*pf())()) () 请写出: typeid (pf).name() 的返回:
分析:
1 int (*)() FivE
2 auto (*)() FPvE
3 auto (*pf)() FPvE
typeid (pf).name() 返回为: FPFPFivEvEvE
FPFPFivEvEvE
auto pf1() -> auto (*)() -> auto (*)() -> int
/*
* File: main44.cpp
* Author: Vicky.H
* Email: eclipser@163.com
*/
#include <iostream>
#include <typeinfo>
int (*(*pf())()) () {
return nullptr;
}
// FPFPFivEvEvE
// int (*)() FivE
// auto (*)() FPvE
// auto (*pf)() FPvE
// auto pf() -> auto (*)() -> int (*)()
// 理解上面的程序
auto pf1() -> auto (*)() -> auto (*)() -> int {
return nullptr;
}
auto pf2(int) -> auto (*)(double, const char*) -> auto (*)(...) -> int {
return nullptr;
}
// 将pf2写为传统格式
// int (*)(...)
// (*)(double,const char*)
// (*pf2)(int)
int (*(*pf3(int))(double,const char*))(...) {
return nullptr;
}
/*
*
*/
int main(void) {
std::cout << typeid (pf).name() << std::endl;
std::cout << typeid (pf1).name() << std::endl;
std::cout << std::is_same < decltype(pf), decltype(pf1)>::value << std::endl;
std::cout << "\n---------------------------" << std::endl;
std::cout << typeid (pf2).name() << std::endl;
std::cout << typeid (pf3).name() << std::endl;
std::cout << std::is_same < decltype(pf2), decltype(pf3)>::value << std::endl;
return 0;
}
FPFPFivEvEvE
FPFPFivEvEvE
1
---------------------------
FPFPFizEdPKcEiE
FPFPFizEdPKcEiE
1