Специализация шаблона класса - PullRequest
0 голосов
/ 05 ноября 2010

Как мне добиться чего-то подобного:

AllocFactorPolicy<1.25> allocDouble;
AllocFactorPolicy<125,-2> allocMaE;  

Я пробовал что-то вроде этого:

template<class T&>
struct AllocFactorPolicy;

template<double&& value>
struct AllocFactorPolicy
{
    double value_;
    AllocFactorPolicy(): value_(value)
    {
        cout << "double&&\n";
    }
};

template<int Mantiss, int Exponent>
struct AllocFactorPolicy
{
    int mantiss_,
        exponent_;
    AllocFactorPolicy():mantiss_(Mantiss),exponent_(Exponent)
    {
        cout << "M&E\n";
    }
};

но это не работает для меня. (VS 2010 Ultimate)

Ответы [ 2 ]

1 голос
/ 05 ноября 2010

Проблема проста: вы объявили один и тот же класс дважды с разными параметрами шаблона arity. Это не разрешено.

Кроме того, вы можете использовать только целочисленные типы, указатели или ссылки в качестве «значений» параметров, поэтому float исключено.

Хотя вы неправильно понимаете идею шаблона ... вам на самом деле не нужно иметь атрибуты, чтобы принимать значения значений, используемых в качестве параметров: они являются константами в вашем классе, и вы, конечно, можете обращаться к ним напрямую.

Прочитайте хорошую книгу по C ++, вы, очевидно, не поняли шаблонов.

0 голосов
/ 05 ноября 2010

У вас есть все C ++ шаблоны все неправильно.Шаблонирование позволяет вам написать функцию / класс один раз с универсальными типами и разрешить любые типы при использовании функции / класса.

Вы не можете передавать данные значения в качестве параметра шаблона.

Здесьпример того, как вы можете создать шаблон вашего AllocFactoryPolicy:

template<typename T>
struct AllocFactorPolicy
{
    T value_;
    AllocFactorPolicy(T value): value_(value)
    {

    }
    //Have getters here....
};

template<typename T, typename U>
struct AllocFactorPolicy
{
    T mantiss_,
    U exponent_;
    AllocFactorPolicy(T mantiss, U exponent):mantiss_(mantiss),exponent_(exponent)
    {

    }
};

Тогда вы можете сделать

AllocFactorPolicy<double> allocDouble(1.25);
AllocFactorPolicy<int, double> allocMaE(125,-2);  

PS Это не проверено, но вы получите изображение.


Обновление Я вижу, что есть 2 структуры с одинаковым именем структуры, почему бы вам не сделать что-то подобное?

template<typename T>
struct AllocFactorPolicy
{
    T value_;
    T mantiss_,
    int exponent_;

    AllocFactorPolicy(T value): value_(value)
    {

    }

    AllocFactorPolicy(T mantiss, int exponent):mantiss_(mantiss),exponent_(exponent)
    {

    }
    //Have getters here....
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...