如何获取STL容器所持有的元素类型?
答案 0 :(得分:20)
container::value_type
答案 1 :(得分:16)
对于容器,一般来说它是X::value_type
。对于关联容器,它将是X::mapped_type
(X::value_type
对应于pair<const Key,T>
)。这是根据C ++标准的第23章。
要检查类型是否相等,您可以使用boost::is_same
。
答案 2 :(得分:4)
检查两种类型是否相同可以这样实现(没有RTTI,值在编译时可用):
template <class T, class U>
struct same_type
{
static const bool value = false;
};
//specialization for types that are the same
template <class T>
struct same_type<T, T>
{
static const bool value = true;
};
//sample usage:
template <class FirstContainer, class SecondContainer>
bool containers_of_same_type(const FirstContainer&, const SecondContainer&)
{
return same_type<
typename FirstContainer::value_type,
typename SecondContainer::value_type
>::value;
}
#include <vector>
#include <list>
#include <iostream>
int main()
{
std::cout << containers_of_same_type(std::vector<int>(), std::list<int>());
std::cout << containers_of_same_type(std::vector<char>(), std::list<int>());
}
(这基本上是boost::is_same
的工作原理,减去某些编译器的变通方法。)
答案 3 :(得分:0)
在什么意义上? 也许使用RTTI和typeid()?
可能你必须使用container :: valuetype,其中container是容器的名称(例如std :: vector)
阿列克
答案 4 :(得分:0)
您需要为我们提供更多背景信息。如果您的意思是希望在编译时知道该值,那么很容易更改它,那么请使用container::value_type
。
typedef vector<int> coordinates;
coordinates seq;
fib::value_type elem = seq.back(); // it's easy to change int type
如果您的意思是容器可能包含各种具体(派生)类型,并且您希望在运行时了解它们,那么您应该重新评估您的方法。在面向对象的编程中,在运行时隐藏类型有时是一种强大的方法,因为这意味着您对所使用的内容做出的假设更少。你当然可以使用RTTI,但可能有更好的方法:我们需要更多的背景知识。
如果您希望比较类型,那么您可能正在走向运行时路径。 C ++支持多态,这实际上是你正在寻找的类型比较 - 但是内置于语言中。您想根据类型执行不同的指令集吗?多态性允许您根据对象的类型执行不同的功能。你不需要编写一行额外的代码 - 只能从一个共同的基础派生。
答案 5 :(得分:0)
使用类似的东西:
if (typeid(yourVariable)==typeid(YourClass)) //...
阿列克
答案 6 :(得分:0)
如果类型是静态已知的,您可以通过使用模板特化来检查它们是否静态相同而不使用rtti。例如使用类似http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_same.html的内容,或者如果无法使用提升,请自行填写