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

yruzcnhs  于 2023-05-20  发布在  其他
关注(0)|答案(8)|浏览(329)

我怎样才能得到一个STL容器所包含的元素的类型?

5jvtdoz2

5jvtdoz21#

container::value_type
qvk1mo1f

qvk1mo1f2#

对于一般的容器,它将是X::value_type。对于关联容器,它将是X::mapped_typeX::value_type对应于pair<const Key,T>)。它是根据C标准的第23章。
要检查类型是否相等,可以使用boost::is_same。C
11 - std::is_same

rta7y2nd

rta7y2nd3#

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

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>());
}

(This基本上是boost::is_same的工作方式,减去某些编译器的变通方法。)

ttisahbt

ttisahbt4#

在什么意义上?可以使用RTTI和typeid()?
可能你必须使用container::valuetype,其中container是容器的名称(例如std::vector)
阿列克

mkshixfv

mkshixfv5#

使用类似这样的东西:

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

阿列克

kuuvgm7e

kuuvgm7e6#

你需要给予我们更多的背景。如果你的意思是你想在编译时知道这个值,这样就可以很容易地修改它,那么就使用container::value_type

typedef vector<int> coordinates;

coordinates seq;
fib::value_type elem = seq.back(); // it's easy to change int type

如果你的意思是容器可能包含各种具体(派生)类型,并且你希望在运行时知道它们,那么你可能应该重新评估你的方法。在面向对象的编程中,在运行时隐藏类型有时是一种强大的方法,因为这意味着您对正在使用的内容做出更少的假设。你当然可以使用RTTI,但可能有更好的方法:我们需要更多的背景信息
如果你想比较类型,那么你可能正在走运行时的道路。C++支持多态性,它本质上就是您所关注的类型比较--但它是内置在语言中的。是否要根据类型执行不同的指令集?多态性允许您根据对象的类型执行不同的函数。您不需要编写一行额外的代码--只需从公共库派生。

kuarbcqp

kuarbcqp7#

假定类型是静态已知的,则可以在不使用RTTI的情况下通过使用模板专门化来静态地检查它们是否相同。例如,使用类似http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_same.html的东西,或者如果boost不可用,则自己滚动

vs91vp4v

vs91vp4v8#

一个用户定义的容器类型-称之为ContainerType-它支持ContainerType::begin (),在C++ 20中,ContainerType::end ()方法可以使用,

using DataType = std::ranges::range_value_t<ContainerType>;

以在需要时引用数据类型。这里有一个例子

#include <iostream>
#include <array>
#include <vector>
#include <ranges>

template <typename T, size_t N>
struct MyContainer
{   
    T * begin () { return m_Arr.data (); }
   
    T * end () { return m_Arr.data () + m_Arr.size (); }
   
    std::array<T, N> m_Arr;
};

template <typename ContainerType> std::vector<std::ranges::range_value_t<ContainerType>> ToVector (ContainerType cc)
{
    using DataType = std::ranges::range_value_t<ContainerType>;
    std::vector<DataType> res;
    for (const auto &value: cc)
    {
        res.push_back (value);
    }
    
    return res;
}

int main ()
{
    MyContainer<double, 4> cc{{0.5, 1., 2., 3.}};
    const auto myVector = ToVector (cc);
    
    for (auto vv: myVector)
        std::cout << vv << "\n";
    
    return 0;
}

相关问题