Is there any way, to default second template type to the type of the first template argument type, to remove the need of specifying the template types when not needed?
So, I have a method, that pops values from byte array:
template<class TYPE1, class TYPE2>
bool pop_value_from_array(TYPE2 &value)
{
if(get_array_size() >= sizeof(TYPE1))
{
value = static_cast<TYPE2>(*reinterpret_cast<const TYPE1*>(get_array_pointer()));
remove_bytes_from_array(sizeof(TYPE1));
return true;
}
return false;
}
And then I can do
uint32_t size;
if (!pop_value_from_array<uint16_t>(size))
{
// Error handling
}
size *= 2;
uint16_t var2;
if (!pop_value_from_array<uint16_t>(var2))
{
// Error handling
}
If I declare another function:
template<class TYPE>
bool pop_value_from_array(TYPE &value)
{
if(get_array_size() >= sizeof(TYPE))
{
value = *reinterpret_cast<const TYPE*>(get_array_pointer());
remove_bytes_from_array(sizeof(TYPE));
return true;
}
return false;
}
I can get rid of the template specification when not needed:
uint32_t size;
// Poping uint16_t from array, and storing to the uint32_t type, so there is no overflow in multiplication
if (!pop_value_from_array<uint16_t>(size))
{
// Error handling
}
size *= 2;
uint16_t var2;
if (!pop_value_from_array(var2))
{
// Error handling
}
So, I want to get rid of the second declaration of the same function