STL提取参数模版的类型
2016-07-02 09:46
351 查看
一、解决的问题
1、其实是可以推导出函数的返回值类型的:
但是是无法在模版类的外面进行使用的
下面的两种情况是编译通过的:
(1)
template<class T>
T Print(T x)
{
return x;
}
(2)
template<class T>
struct A
{
T Print(T value)
{
return value;
}
};
2、解决T无法在类模版的外面进行使用的问题
例如:
函数定义:
template<class T>
struct B
{
B(T x)
:_a(x)
{}
typedef T ValueType;
T& operator*()
{
return _a;
}
T _a;
};
template<class T>
typename T::ValueType Fun1(T value)
{
return *value;
}测试用例:
void Test()
{
B<int> b1(10);
cout<<Fun1(b1);
}
3、总结
定义了一个模版的函数,这个时候你传入的参数又是一个模版,这个时候怎么使用这个参数模版中的对应的类型,这个时候就可以使用,这个技术:
在参数模版的里面定义一个typededf T ValueType(一定要定义为public的为什么,自己思考),这个时候就可以使用 typename T::ValueType的方式拿到对应的类型,
为什么要加typename,这是因为编译器不知道这个ValueType到底是变量,还是对应的类型,加上typename之后,这个时候就告诉编译器是一个类型,这个时候就可以顺利的同过编译了
1、其实是可以推导出函数的返回值类型的:
但是是无法在模版类的外面进行使用的
下面的两种情况是编译通过的:
(1)
template<class T>
T Print(T x)
{
return x;
}
(2)
template<class T>
struct A
{
T Print(T value)
{
return value;
}
};
2、解决T无法在类模版的外面进行使用的问题
例如:
函数定义:
template<class T>
struct B
{
B(T x)
:_a(x)
{}
typedef T ValueType;
T& operator*()
{
return _a;
}
T _a;
};
template<class T>
typename T::ValueType Fun1(T value)
{
return *value;
}测试用例:
void Test()
{
B<int> b1(10);
cout<<Fun1(b1);
}
3、总结
定义了一个模版的函数,这个时候你传入的参数又是一个模版,这个时候怎么使用这个参数模版中的对应的类型,这个时候就可以使用,这个技术:
在参数模版的里面定义一个typededf T ValueType(一定要定义为public的为什么,自己思考),这个时候就可以使用 typename T::ValueType的方式拿到对应的类型,
为什么要加typename,这是因为编译器不知道这个ValueType到底是变量,还是对应的类型,加上typename之后,这个时候就告诉编译器是一个类型,这个时候就可以顺利的同过编译了
相关文章推荐
- 浅析STL中的常用算法
- STL区间成员函数及区间算法总结
- c++ STL容器总结之:vertor与list的应用
- C++在成员函数中使用STL的find_if函数实例
- 关于STL中list容器的一些总结
- 关于STL中的map容器的一些总结
- 浅析stl序列容器(map和set)的仿函数排序
- STL list链表的用法详细解析
- stl容器set,map,vector之erase用法与返回值详细解析
- STl中的排序算法详细解析
- 关于STL中vector容器的一些总结
- 关于STL中set容器的一些总结
- 简单说说STL的内存管理
- STL与泛型编程(1)---模板
- CppUtest发现的STL容器内存泄漏问题
- STL中算法
- STL简单应用
- vector-list-deque
- 三十分钟掌握STL
- Qt中QSet的使用