Особые случаи в шаблонах C ++ - PullRequest
2 голосов
/ 25 января 2012

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

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

Пример. Я хотел бы сделать что-то вроде этого:

 template < class Elem > class Array1D
 {
    Array1D<Elem>& operator += (const Elem& a)
    {
    if (typeof(Elem) == uchar)
    {
       // use special IPP operation here
    }
    else
    {
           // fall back to default behaviour
    }
 }

Есть идеи, как это сделать? Желательно без помощи других библиотек.

Спасибо

Ответы [ 4 ]

4 голосов
/ 25 января 2012

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

1 голос
/ 25 января 2012

Используйте специализацию:

    template<> 
    class Array1D<uchar>
    {
        Array1D<uchar>& operator += (const uchar& a)
        {
        // special behaviour
        }
    };

Но если вы не хотите переписывать все остальные функции в Array1D, подумайте об использовании перегрузки для оператора + =.

1 голос
/ 25 января 2012

Я думаю, вы хотите специализацию шаблона.Эта статья объясняет основы:

http://www.cprogramming.com/tutorial/template_specialization.html

1 голос
/ 25 января 2012

Шаблон Specialize, например:

template<> class Array1D<char>
 {
    Array1D<char>& operator += (const char& a)
    {
       // use special IPP operation here
    }
 }

и в общем случае используется поведение по умолчанию.

...