C++11 追踪返回类型
来源:互联网 发布:java定义错误枚举类 编辑:程序博客网 时间:2024/04/30 05:46
首先,我们先掌握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
- C++11 追踪返回类型
- C++11:类型推导和追踪函数返回类型decltype
- C#partial method不能有返回类型
- 关于c中&的返回值类型
- 学习C++——返回类型
- c++:函数返回引用类型和非引用类型
- c++11 尾随返回类型
- 返回类型
- C/C++中main函数的返回值类型
- [C++]main函数为什么要有返回类型int?
- [跨平台C++] 返回const char* 类型的函数样板
- c++primer之函数(返回类型和return语句)
- nodejs调用c++dll并返回结构类型
- c/c++中const成员函数的返回值类型
- C++primer学习笔记-----6.3返回类型和return 语句
- c语言-函数执行顺序,函数返回类型那些事
- C#WebService返回dynamic类型报错问题
- 返回引用类型的函数指针(c++)
- tomcat的安装、配置与简单使用(win7 32位)
- 关于 contentWindow, contentDocument
- hdu 2020
- MYSQL 记录总结 更新中
- 关于jmeter的入门
- C++11 追踪返回类型
- htmlcxx解析中文时出现断言_ASSERTE((unsigned)(c + 1) <= 256)的解决方法
- ios7 国际化
- hdu——1284——钱币兑换问题
- 哈希--查找出现过的数字
- spring_secrity
- 改造CAS单点登录 --- 自定义登陆页面(客户端)
- android layout属性介绍
- IBM调整渠道规划欲推动云业务增长