The type std::conditional
in the standard library header <type_traits>
can select one type or the other, based on a compile-time boolean value:
template<typename T>
struct ValueOrPointer
{
typename std::conditional<(sizeof(T) > sizeof(void*)), T*, T>::type vop;
};
This struct contains a pointer to T
if T
is larger than the size of a pointer, or T
itself if it is smaller or equal to a pointer's size. Therefore sizeof(ValueOrPointer)
will always be <= sizeof(void*)
.