Я пытаюсь найти решение, чтобы иметь постоянные числовые литералы внутри метода класса шаблона. Я создаю некоторые классы математических шаблонов для использования с типами float или double. Проблема в том, что литералы различаются в зависимости от типа данных (например, «0.5f» для float и «0.5» для double). Пока у меня есть два решения. Некоторый гипотетический код для первого:
template <typename T>
class SomeClass
{
public:
T doSomething(T x);
};
template <>
float SomeClass<float>::doSomething(float x)
{
float y = 0.5f;
/*
* Do computations...
*/
return x;
}
template <>
double SomeClass<double>::doSomething(double x)
{
double y = 0.5;
/*
* Do computations...
*/
return x;
}
Описанный выше подход заставляет переписывать целые методы для каждого типа, с которым он используется.
Другой подход:
template <typename T>
class SomeClass
{
public:
T doSomething(T x);
private:
T getValue();
};
template <typename T>
T SomeClass<T>::doSomething(T x)
{
T y = getValue();
/*
* Do computations...
*/
return x;
}
template <>
float SomeClass<float>::getValue()
{
return 0.5f;
}
template <>
double SomeClass<double>::getValue()
{
return 0.5;
}
Этот подход не требует многократного написания одних и тех же методов для определенного типа, но требует наличия множества методов getValue() для каждого «магического числа», которое необходимо использовать внутри метода.
Есть ли другой, более элегантный способ решить эту проблему?