Considering template metaprogramming techniques if I have
std::vector<int> v;
v.push_back(42.42f);
this works, mainly because the constructor being used it's not marked explicit
, in other words my push_back
it's not type safe.
Now I'm in a situation where I don't even know how a container v
is declared, in this case it's int
, but I need to deduce the type automatically while having a generic std::vector<T>
. I would like a solution to get T
.
in C++11 there is something like remove_all_extents
( with an useful member type
) but apparently it's only useful for the old arrays, but it's basically what I would like to achieve.
I would like to trigger an error when the push_back
it's not type safe or deduce the type so I can write an assertion or implement something on my own.
I really can't find a working solution for this, it's so simple in theory, but once a vector is declared there is no explicit information about the type used for the elements.
I also would like to avoid explicit type inference, like translating foo
from my ideal function call
foo( container, elements ... )
to
foo<int>(container, elements ...)
where int
is the type for the elements of container
, this is not safe too in my opinion, it's also more verbose and error prone.
So how do I retrieve the type for the elements of a container in C++11 ?
You can get the type like this:
typename std::vector<T>::value_type;
Then use static_assert
together with std::is_same
.
template <typename T1, typename T2>
void special_push_back(std::vector<T1>& v, T2 elem)
{
// check that T1 and T2 are the same before pushing elem into v
}
then
std::vector<int> v;
special_push_back(v, 3.14); // Compile time error: double is not int
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With