我怎样才能得到一个STL容器所包含的元素的类型?
5jvtdoz21#
container::value_type
qvk1mo1f2#
对于一般的容器,它将是X::value_type。对于关联容器,它将是X::mapped_type(X::value_type对应于pair<const Key,T>)。它是根据C标准的第23章。要检查类型是否相等,可以使用boost::is_same。C11 - std::is_same。
X::value_type
X::mapped_type
pair<const Key,T>
boost::is_same
std::is_same
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的工作方式,减去某些编译器的变通方法。)
ttisahbt4#
在什么意义上?可以使用RTTI和typeid()?可能你必须使用container::valuetype,其中container是容器的名称(例如std::vector)阿列克
mkshixfv5#
使用类似这样的东西:
if (typeid(yourVariable)==typeid(YourClass)) //...
阿列克
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++支持多态性,它本质上就是您所关注的类型比较--但它是内置在语言中的。是否要根据类型执行不同的指令集?多态性允许您根据对象的类型执行不同的函数。您不需要编写一行额外的代码--只需从公共库派生。
kuarbcqp7#
假定类型是静态已知的,则可以在不使用RTTI的情况下通过使用模板专门化来静态地检查它们是否相同。例如,使用类似http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_same.html的东西,或者如果boost不可用,则自己滚动
vs91vp4v8#
一个用户定义的容器类型-称之为ContainerType-它支持ContainerType::begin (),在C++ 20中,ContainerType::end ()方法可以使用,
ContainerType
ContainerType::begin ()
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; }
8条答案
按热度按时间5jvtdoz21#
qvk1mo1f2#
对于一般的容器,它将是
X::value_type
。对于关联容器,它将是X::mapped_type
(X::value_type
对应于pair<const Key,T>
)。它是根据C标准的第23章。要检查类型是否相等,可以使用
boost::is_same
。C11 -std::is_same
。rta7y2nd3#
检查两个类型是否相同可以这样实现(没有RTTI,value在编译时可用):
(This基本上是
boost::is_same
的工作方式,减去某些编译器的变通方法。)ttisahbt4#
在什么意义上?可以使用RTTI和typeid()?
可能你必须使用container::valuetype,其中container是容器的名称(例如std::vector)
阿列克
mkshixfv5#
使用类似这样的东西:
阿列克
kuuvgm7e6#
你需要给予我们更多的背景。如果你的意思是你想在编译时知道这个值,这样就可以很容易地修改它,那么就使用
container::value_type
。如果你的意思是容器可能包含各种具体(派生)类型,并且你希望在运行时知道它们,那么你可能应该重新评估你的方法。在面向对象的编程中,在运行时隐藏类型有时是一种强大的方法,因为这意味着您对正在使用的内容做出更少的假设。你当然可以使用RTTI,但可能有更好的方法:我们需要更多的背景信息
如果你想比较类型,那么你可能正在走运行时的道路。C++支持多态性,它本质上就是您所关注的类型比较--但它是内置在语言中的。是否要根据类型执行不同的指令集?多态性允许您根据对象的类型执行不同的函数。您不需要编写一行额外的代码--只需从公共库派生。
kuarbcqp7#
假定类型是静态已知的,则可以在不使用RTTI的情况下通过使用模板专门化来静态地检查它们是否相同。例如,使用类似http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_same.html的东西,或者如果boost不可用,则自己滚动
vs91vp4v8#
一个用户定义的容器类型-称之为
ContainerType
-它支持ContainerType::begin ()
,在C++ 20中,ContainerType::end ()
方法可以使用,以在需要时引用数据类型。这里有一个例子