C ++ специализирует шаблонный класс для получения дополнительного параметра шаблона - PullRequest
2 голосов
/ 31 марта 2012

Можно ли специализировать класс шаблона для получения дополнительных параметров шаблона?

Например:

template <typename T>
struct X {
  void foo() { cerr << "Generic" << endl;}
};


template <>
template <bool b>
struct X<int> {
  void foo() { cerr << "Specialization" << endl;}
};

Я не могу заставить вышеуказанное работать с g ++, но, возможно, есть некоторыетрюк, который сделает эту работу.

Редактировать: я не хочу перемещать шаблон <bool b> в базовый шаблон X, потому что это особенность только X<int>. Если мне нужно, есть ли способ, которым я могу позволить пользователям недолжны указать какие-либо значения для этого?Я действительно хотел бы подход, который не идет по этому пути.

1 Ответ

2 голосов
/ 31 марта 2012

Вы можете изменить свой основной шаблон так, чтобы он принимал прокси-класс черт взамен:

template <typename T>
struct Foo
{
    typedef typename T::type type;

    // work with "type"

    void static print() { std::cout << T::message << std::endl; }
}

Затем определите класс черт:

template <typename T>
struct traits
{
    typedef T type;
    static const char * const message  = "Generic";
};

Теперь вы можете создавать экземпляры Foo<traits<double>> и Foo<traits<int>>, и вы можете инкапсулировать дополнительное поведение в классе черт, который вы можете специализировать по мере необходимости.

template <>
struct traits<int>
{
    typedef int type;
    static const char * const message = "Specialized";
};
...