Специализированная функция в не специализированном классе Template - PullRequest
3 голосов
/ 22 февраля 2012

Пожалуйста, используйте код ниже
Специализированная функция в не специализированном классе шаблонов
Можно ли написать специализированную функцию foo для не специализированного шаблона класса MyClass [Строка № 7]? Если да, то каков синтаксис для того же.
С уважением,
Атул

Ответы [ 4 ]

2 голосов
/ 22 февраля 2012

Это можно сделать, если создать полную специализацию шаблона класса.Просто обратитесь к ответу в этом вопросе: Если я хочу специализировать только один метод в шаблоне, как мне это сделать?

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

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

2 голосов
/ 22 февраля 2012

Посмотрите на мой пример ниже, я попытался ответить на ваш вопрос (если я угадал) в простейшем коде, который я могу:

#include <iostream>

using namespace std;

template<typename T>
class Some
{
public:
    template<typename U> void foo(U val);
};

template<typename T>
template<typename U>
void Some<T>::foo(U val)
{
    cout << "Non specialized" << endl;
}

template<>
template<>
void Some<char>::foo(char val)
{
    cout << "Char specialized" << endl;
}

int main()
{
    Some<int> t1;
    t1.foo(5);

    Some<char> t2;
    t2.foo('c');

    return 0;
}
  1. Здесь важно отметить, что «Вы не можете специализировать свой класс и функционировать независимо», т. Е. Вы должны специализироваться на обоих одновременно, как это сделано в примере.

  2. Кроме того, при этом вы теряете возможность специализировать свой класс для этого типа данных "char" в этом случае. (Нужно подтвердить это).

ОБНОВЛЕНИЕ :: Подтверждено в пункте 2.

1 голос
/ 22 февраля 2012

Если вы спрашиваете,

(1) вам нужна функция Foo(), которая не принимает аргументов и возвращает void внутри MyClass

(2)Это Foo() должно быть исключительным для MyClass, когда тип шаблона bool, т.е. только для MyClass<bool>

, тогда вот такой путь:

template<class Precision>
class MyClass {
  ...
public:
  ...
  void Foo ();  // don't implement here
};
...
template<>
void MyClass<bool>::Foo ()  // implementing only for 'MyClass<bool>'
{        // invoking for other 'MyClass<>' will result in compiler error
  ...
}
1 голос
/ 22 февраля 2012

Если вы хотите специализировать MyClass :: Foo, это будет выглядеть так:

template <>
void MyClass<bool>::Foo(bool A)
{
  // code goes here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...