Могу ли я использовать частичную специализацию шаблона для функции (не являющейся членом)? - PullRequest
4 голосов
/ 25 декабря 2009

Я пытаюсь использовать частичную специализацию шаблона для функции (не являющейся членом), и я использую синтаксис. Я искал в StackOverflow другие вопросы с частичной специализацией шаблона, но они касаются частичной специализации шаблона класса или функции-члена.

Для начала у меня есть:

struct RGBA {
    RGBA(uint8 red, uint8 green, uint8 blue, uint8 alpha = 255) :
        r(red), g(green), b(blue), a(alpha)
    {}

    uint8 r, g, b, a;
};

struct Grayscale {
    Grayscale(uint8 intensity) : value(intensity) {}

    uint8 value;
};

inline uint8 IntensityFromRGB(uint8 r, uint8 g, uint8 b) {
    return static_cast<uint8>(0.30*r + 0.59*g + 0.11*b);
}

// Generic pixel conversion.  Must specialize this template for specific
// conversions.
template <typename InType, typename OutType>
OutType ConvertPixel(InType source);

Я могу сделать полную специализацию ConvertPixel, чтобы сделать функцию преобразования RGBA в оттенки серого следующим образом:

template <>
Grayscale ConvertPixel<RGBA, Grayscale>(RGBA source) {
    return Grayscale(IntensityFromRGB(source.r, source.g, source.b));
}

Возможно, у меня будет больше типов пикселей, которые предлагают красный, зеленый и синий, но, возможно, в другом формате, поэтому мне бы хотелось получить частичную специализацию, задав Grayscale для OutType по-прежнему учитывают различные InType с. Я пробовал различные подходы, как это:

template <typename InType>
Grayscale ConvertPixel<InType, Grayscale>(InType source) {
    return Grayscale(IntensityFromRGB(source.r, source.g, source.b));
}

Но компилятор (Microsoft VS 2008 C ++) отклоняет его.

Возможно ли то, что я пытаюсь сделать? Если да, то какой синтаксис правильный?

Ответы [ 3 ]

8 голосов
/ 25 декабря 2009

C ++ не допускает частичной специализации шаблонов функций.

Он даже не допускает частичной специализации шаблонов функций-членов. Когда вы определяете функцию, которая является частью частичной специализации шаблона класса, это может выглядеть так, будто вы частично специализировали функцию-член. Но у тебя нет.

Херб Саттер обсуждает частичную специализацию

5 голосов
/ 25 декабря 2009

Возможно использование специализации класса partitial:

template<class A, class B>
struct Functor {
    static A convert(B source);
};

template<class B>
struct Functor<GrayScale, B> {
    static GrayScale convert(B source) {
         return Grayscale(IntensityFromRGB(source.r, source.g, source.b));
    }
};

// Common function
template<class A, class B>
A Convert(B source) {
   return typename Functor<A,B>::convert(source);
}
3 голосов
/ 25 декабря 2009

Частичная специализация - это концепция, которая применяется только к классам, а не к свободным функциям или функциям-членам. То, что вы, вероятно, захотите сделать, это просто обеспечить перегрузки функций (или функций-членов), которые сопоставляют то, что частичные и полные специализации делают для классов.

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