C++ 检查stl容器中元素的类型-c++;

C++ 检查stl容器中元素的类型-c++;,c++,stl,types,containers,C++,Stl,Types,Containers,如何获取STL容器所包含的元素类型?在什么意义上? container::value_type 可能使用RTTI和typeid() 可能必须使用container::valuetype,其中container是容器的名称(例如std::vector) Alek对于集装箱,通常为X::value\u类型。对于关联容器,它将是X::mapped_type(X::value_type对应于pair)。根据C++标准第23章, 要检查类型是否相等,您可以使用。您需要为我们提供更多上下文。如果您的意思是

如何获取STL容器所包含的元素类型?

在什么意义上?
container::value_type
可能使用RTTI和typeid()

可能必须使用container::valuetype,其中container是容器的名称(例如std::vector)


Alek

对于集装箱,通常为
X::value\u类型
。对于关联容器,它将是
X::mapped_type
X::value_type
对应于
pair
)。根据C++标准第23章,


要检查类型是否相等,您可以使用。

您需要为我们提供更多上下文。如果您的意思是希望在compiletime时知道该值,以便轻松更改它,那么请使用
container::value\u type

typedef vector<int> coordinates;

coordinates seq;
fib::value_type elem = seq.back(); // it's easy to change int type
typedef矢量坐标;
坐标顺序;
fib::value_type elem=seq.back();//更改int类型很容易
如果您的意思是容器可能包含各种具体(派生)类型,并且您希望在运行时了解它们,那么您可能应该重新评估您的方法。在面向对象编程中,在运行时隐藏类型有时是一种强大的方法,因为这意味着您对正在使用的内容进行的假设更少。当然可以使用RTTI,但可能有更好的方法:我们需要更多的上下文来说明


如果您希望比较类型,那么您可能会选择运行时路径。C++支持多态性,这是你所关注的类型比较,但它是内置于语言中的。是否要根据类型执行不同的指令集?多态性允许您根据对象的类型执行不同的函数。您不需要额外编写一行代码,只需从公共基础派生即可。

使用以下方法:

if (typeid(yourVariable)==typeid(YourClass)) //...

Alek

如果类型是静态已知的,那么您可以通过模板专门化检查它们是否静态相同,而无需使用rtti。e、 g.使用类似于或如果boost不可用,则使用您自己的

检查两种类型是否相同,是否可以这样实现(没有RTTI,值在编译时可用):

模板
结构类型相同
{
静态常量布尔值=假;
};
//相同类型的专门化
模板
结构类型相同
{
静态常量布尔值=真;
};
//示例用法:
模板
相同类型的布尔容器(const FirstContainer&,const SecondContainer&)
{
返回相同的类型<
typename FirstContainer::值\类型,
typename SecondContainer::值\类型
>::价值;
}
#包括
#包括
#包括
int main()
{

std::cout ok这已经很好了,但我似乎无法比较container::value\u type返回的两种值类型。有什么建议吗?@Patrick:你无法比较“value\u type返回的值”因为value\u type是一个类型,而不是一个值。因此,比较两个value\u类型是一个静态操作,而不是运行时操作。根据您试图实现的目标,您可能希望查看“is\u same”在Boost.TypeTraits中:@Patrick:您要求的是存储在向量中的元素的类型,而不是元素的值。您可以比较值,但不能比较类型(至少在没有很多元编程技巧的情况下是这样)也许你应该解释一下你想做什么。你到底想做什么?因为C++是静态类型的,你应该知道元素是什么类型的(例如,向量,持有int)。。如果你能解释一下为什么你不知道这些类型是什么,以及你想用它们做什么,这将有助于回答这个问题。@David Thornley:
模板void foo(std::template arg){/*在这里,我们不知道元素类型是什么*/}
我认为这是一种非常常见的情况。@Jalf:在那一点上是正确的。但在那一点上foo()只是一个概念。但是一旦你使用foo(),你也会知道类型。如果你想测试继承链;)或者dynamic\u cast,但前提是你的类型有虚拟方法。dynamic\u cast当然是在多态指针上使用的。我没提过。你是对的。谢谢你指出;)
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>());
}