c++templatescontainerssize-type

Is there a generic way to get `size_type` from a C++ container?


Is it possible to get a type alias for size_type from a container such as std::vector or std::map without supplying a value_type of some kind?

I am writing a program where I need the size_type from two different map types. If, however, I create a typedef for the first map type, the name size_type is not available for the second. My workaround (a.k.a., "kludge") solution, it to tell a lie.

std::map<char, int> letters;
std::map<std::string, int> digraphs, trigraphs;

// This lie is good enough for both map types.
using size_type = typename std::map<int, int>::size_type;

In other cases, I would just prefer not to supply a value_type. Here is a contrived example.

// Yes, I know this can be cleaned up by doing it in stages, but ugh!
using size_type = typename std::map<std::string, std::pair<std::string, std::string>>::size_type;

At the end of the day, we all know size_type is probably going to be an alias for std::size_t, even in corner cases such as std::vector<bool>. Nevertheless, I still try to do things the "correct" way, by using size_type.

So, is there a way to get size_type without supplying value_type?


Solution

  • So, is there a way to get size_type without supplying value_type?

    No, because size_type can be a different type for every value_type.

    Of course, as you said yourself, that's normally not the case and size_type is almost always just std::size_t, but both the standard library implementation itself, as well as user-defined specializations of the container templates, are allowed to define size_type differently for different value_type and there is no requirement that it must be related to std::size_t.

    There isn't even any requirement that size_type must be smaller or larger than std::size_t. If you want to have generic library code that works with any standard-conforming implementation, you'll have to always consider size_type individually and make no assumptions about their relation.