Специализация функций в классе шаблонов для литералов с плавающей запятой и двойных чисел

Я пытаюсь найти решение, чтобы иметь постоянные числовые литералы внутри метода класса шаблона. Я создаю некоторые классы математических шаблонов для использования с типами 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() для каждого «магического числа», которое необходимо использовать внутри метода.

Есть ли другой, более элегантный способ решить эту проблему?

10
задан umebe 18 June 2012 в 17:34
поделиться