Не совсем понятно из вашего вопроса, но, предполагая, что вы хотите генерировать случайные значения различными способами для разных типов, вы можете использовать специализацию шаблонной функции:
template <class T>
T random_value(); // no definition
template <>
float random_value<float>()
{
return float(random()) / RAND_MAX; // number in [0, 1)
}
template <>
int random_value<int>()
{
return random();
}
template <>
uint64_t random_value<uint64_t>()
{
return (uint32_t(random()) << 32) | uint32_t(random());
}
А затем внутри RowArray::RowArray
вы просто используете:
rowdata[i] = random_value<T>();
Чтобы объединить связанные специализации (например, все интегральные типы), взгляните на std::enable_if
.
Второй способ сделать это в C ++ 17 - это if constexpr
и std::is_same_v
. Например, внутри вашего RowArray::RowArray
конструктора вы можете сделать что-то вроде этого:
for (int i = 0; i < size; ++i)
{
if constexpr (std::is_same_v<T, float>)
row[i] = /* whatever you want for float case */
else if constexpr (std::is_same_v<T, int>)
row[i] = /* whatever you want for int case*/
else
static_assert(sizeof(T) == 0, "unsupported type");
}
Взгляните на заголовок type_traits
, чтобы узнать, как проверить все целочисленные типы и т. Д.
Наконец, взгляните на библиотеку C ++ random
http://www.cplusplus.com/reference/random/, чтобы избежать ошибок при работе со случайными значениями.