Getting data type size from std :: type_info

In C ++ 03, when you use the typeid operator, the type_info object is returned.

Is it possible to get a size of this type based only on this result, for example, returned by the sizeof operator?

For instance:

std::type_info info = typeid(int); int intSize = sizeof(int); int intSize2 = info.getSize(); // doesn't exist! 

The problem is that we are using a third-party array with several arrays that returns type_info, but not the size of this type.

+6
source share
1 answer

The best way I can see (I would like to be proved incorrectly) is to register types in advance, for example:

 #include <typeinfo> #include <iostream> #include <stdexcept> #include <map> #include <vector> typedef std::map<const std::type_info*, std::size_t> sizes_container; // we cannot use std::type_index, but that ok - typeid returns const std::type_info&, which refers to an object which lives during the entire lifetime of the program sizes_container& sizes() // wrapped in a function to avoid static initialization order fiasco { static sizes_container s; return s; } template<typename T> void register_size() // Register the type. Can be called multiple times for the same type. { sizes().insert(sizes_container::value_type(&typeid(T), sizeof(T))); } class no_such_type : public std::domain_error { public: no_such_type(const std::string& str) : std::domain_error(str) { } }; std::size_t get_size(const std::type_info& typeinfo) { sizes_container::iterator it = sizes().find(&typeinfo); if(it != sizes().end()) { return it->second; } else { throw no_such_type(std::string("No type ") + typeinfo.name() + " registered"); } } int main() { register_size<int>(); register_size<std::vector<int> >(); std::cout << get_size(typeid(int)) << "\n" // get the size from std::type_info, possibly at runtime << get_size(typeid(std::vector<int>)) << "\n" << std::flush; std::cout << get_size(typeid(long)); // if the type isn't registered, the exception no_such_type is thrown } 

Possible output:

 4 24 This application has requested the Runtime to terminate it in an unusual way. Please contact the application support team for more information. terminate called after throwing an instance of 'no_such_type' what(): No type l registered 

If you can control the creation of arrays (for example, using the factory method), you can directly register this type here.

+1
source

Source: https://habr.com/ru/post/979770/


All Articles