Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.72
sergio1
12 / 1 / 1
Регистрация: 08.11.2008
Сообщений: 41
#1

Специализация шаблонного класа - C++

06.04.2011, 22:55. Просмотров 3103. Ответов 25
Метки нет (Все метки)

Каким образом можно написать специализацию шаблонного класса так, чтобы часть методов являлась специализированной, то есть писалась заново, а остальные методы - такие, какими бы они были если бы шаблонный клас был без специализации.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <int Size>
class MyClass
{
public:
  int Method1();
  int Method2();
};
 
template <>
class MyClass<0>
{
public:
  /* хотелось бы не писать еще раз реализацию, так как она меняться не должна. */
  int Method1();
  /* Новая реализация. */
  int Method2();
};
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2011, 22:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Специализация шаблонного класа (C++):

Явная специализация метода для типа шаблонного класса - C++
Добрый вечер, уважаемые знатоки! :) Хочу задать вопрос по созданию шаблонов. В общем, пусть у меня есть шаблон некоторого класса: ...

шаблонные методы шаблона. Специализация. - C++
Вопрос: каким образом можно вынести реализацию методов класса за его пределы? Изначально вопрос формулировался так: Каким образом можно...

Клонирование объекта шаблонного класса - C++
Задача ниже представленного механизма - запоминать функции/методы со всеми аргументами, и производить их отложенный запуск по требованию ...

Выбор шаблонного варианта для аргумента-массива - C++
По стопам оффтопа в теме решил создать свою. Для ускорения прояснения ситуации, так сказать. Имеем код: #include &lt;iostream&gt; ...

как обьявить массив указaтелей на обьекты класа - C++ Builder
как обьявит массив указтелей на обьекты класа объявление T *obiecti=new T*; почему-то не вызывает конструктор объясните пожалуйста

Как свойство класа сделать "толька для чтения" - C++ Builder
подскажите пожалуйста как при объявлении класса свойтсво обьявить как &quot;только для чтения&quot;

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Evg
Эксперт CАвтор FAQ
17809 / 6019 / 388
Регистрация: 30.03.2009
Сообщений: 16,535
Записей в блоге: 26
08.04.2011, 11:06 #16
Цитата Сообщение от ForEveR Посмотреть сообщение
По размеру это может быть нечто вроде
У ТС речь шла только о другой начинке для метода. Но не для поля класса
0
sergio1
12 / 1 / 1
Регистрация: 08.11.2008
Сообщений: 41
08.04.2011, 16:20  [ТС] #17
Специализация метода стала бы отличным решением если бы не выяснилась одна неприятная вещь. Кроме изменения реализации нескольких методов мне еще нужно убрать парочку методов из данной специализации. К сожалению, я не указал это в первом посте, но тогда я еще и не знал что оно мне будет нужно. И тут, я так понимаю, уже без наследования совсем никак. Конечно, можно кидать ошибку компиляции в методе, который я бы хотел убрать, и таким образом запретить вызов метода, но это выглядит уж совсем убого.
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.04.2011, 16:40 #18
Тогда нужно будет в унаследованном классе переместить эти методы в private. Но ничто не помешает вызвать их полиморфно.
Да и видимость методов в дочерних классах лучше не менять.
0
Evg
Эксперт CАвтор FAQ
17809 / 6019 / 388
Регистрация: 30.03.2009
Сообщений: 16,535
Записей в блоге: 26
08.04.2011, 18:25 #19
Цитата Сообщение от sergio1 Посмотреть сообщение
Кроме изменения реализации нескольких методов мне еще нужно убрать парочку методов из данной специализации
Это уже вообще не шаблон. А точнее, надо отдельный класс делать
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
08.04.2011, 21:41 #20
ну кто же мешает поизвращаться-то...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
 
class BaseMethods
{
public:
    //Методы из паблика нужны везде кроме каких-то конкретных классов.
    void Method1()
    {
        std::cout<<"Base::Method1\n";
    }
    void Method2()
    {
        std::cout<<"Base::Method2\n";
    }
protected:
    //Нужны везде.
    void Method3()
    {
        std::cout<<"Base::Method3\n";
    }
    BaseMethods() 
    {
    }
};
 
template<int s>
class Some:public BaseMethods
{
public:
    void Method1()
    {
        std::cout<<"Some::Method1\n";
    }
    void Method3()
    {
        BaseMethods::Method3();
    }
};
 
template<>
class Some<0>:protected BaseMethods
{
public:
    void Method3()
    {
        BaseMethods::Method3();
    }
};
 
int main()
{
    //BaseMethods Ob;//ошибка компиляции
    Some<5> SOb;
    SOb.Method1();
    SOb.Method2();
    SOb.Method3();
    Some<0> ZeroSOb;
    //Следующие два метода вызовут ошибку компиляция
    //ZeroSOb.Method1();
    //ZeroSOb.Method2();
    ZeroSOb.Method3();
}
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
08.04.2011, 22:16 #21
Цитата Сообщение от Deviaphan Посмотреть сообщение
Тогда нужно будет в унаследованном классе переместить эти методы в private. Но ничто не помешает вызвать их полиморфно.
Да и видимость методов в дочерних классах лучше не менять.
совершенно верно, на уровне синтаксиса это возможно, но в ++ нельзя изменять видимость части интерфейса

следующее совершенно валидно

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
#define PRINT std::cout << "(" << __FUNCTION__ << ") "
 
class A
{
public:
  virtual void getA(){ PRINT; }
private:
  virtual void getB(){ PRINT; }
};
 
class B : public A
{
  virtual void getA(){ PRINT; }
};
 
int main()
{
  B b;
  ((A*)&b) -> getA();
}
0
Evg
Эксперт CАвтор FAQ
17809 / 6019 / 388
Регистрация: 30.03.2009
Сообщений: 16,535
Записей в блоге: 26
09.04.2011, 00:38 #22
Цитата Сообщение от ForEveR Посмотреть сообщение
ну кто же мешает поизвращаться-то...
Как бы концептуально неправильно через один шаблон делать непохожие вещи. Шаблон используется для похожих вещей
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.04.2011, 06:38 #23
Без джамперной функции
C++
1
2
3
4
5
6
template<>
class Some<0>:protected BaseMethods
{
public:
        using BaseMethods::Method3;
};
0
Evg
Эксперт CАвтор FAQ
17809 / 6019 / 388
Регистрация: 30.03.2009
Сообщений: 16,535
Записей в блоге: 26
09.04.2011, 10:11 #24
Тему на форуме так и не нашёл, но был хороший пример, демонстрирующий нечёткое понимание ООП.

Нужно было завести класс "асбстрактная комната". Далее от него сделать производные классы "кухня" и "жилая комната". Далее сделать класс "однокомнатная квартира", в который бы входили "кухня" и "жилая комната". До этого момента всё правильно. Далее требовалось создать класс "двухкомнатная квартира", который есть производный класс от "однокомнатная квартира" и в котором есть дополнительное поле "вторая жилая комната". Вот это место идеологически НЕ правильное, потому что двухкомнатная квартира НЕ является производной от однокомнатной. Хотя с технической точки зрения такой код будет работать. Правильной реализацией явилось бы создание отдельного класса "двухкомнатная квартира", содержащего в себе кухню и две комнаты. Ну либо как вариант работать от класса "абстрактная квартира".

Вот и в данном случае имеет место быть такая же идеологическая ошибка. Если "специализация" класса выливается в то, что какие-то методы класса должны быть отключены, то для этого надо делать другой шаблон. Потому что предложенная "специализация" на самом деле описывает отдельную сущность, а не специализацию шаблона
2
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.04.2011, 10:49 #25
Цитата Сообщение от Evg Посмотреть сообщение
для этого надо делать другой
Класс Квартира, который будет агрегировать Комнаты.
С переводом на термины проекта ТС.
0
Evg
Эксперт CАвтор FAQ
17809 / 6019 / 388
Регистрация: 30.03.2009
Сообщений: 16,535
Записей в блоге: 26
09.04.2011, 10:53 #26
Цитата Сообщение от Deviaphan Посмотреть сообщение
С переводом на термины проекта ТС
ТС вообще толком не сказал, что он хочет, а потому я бы не стал гадать
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2011, 10:53
Привет! Вот еще темы с ответами:

Специализация шаблонного класса - C++
Здравствуйте ! Задача: нужно &quot;вытянуть&quot; тип переменной из списка аргументов конструктора (см. текст). Возможно ли, вообще, такое ?...

Явная специализация шаблонного класса - C++
Всем привет, не могу разобраться с определением функций-членов для явной специализации Имеем след. код: template &lt;class Type&gt; class A...

Вызов метода у шаблонного поля, шаблонного класса - C++
Пытаюсь разобраться с шаблонами- задача создать шаблонный класс, у которого есть шаблонное поле. и затем вызывать метод у этого поля. ...

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? - C++
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); } template &lt;class T&gt; void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.04.2011, 10:53
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru