Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: специализация шаблона класса  (Прочитано 14916 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 22-08-2012 05:27 » 

(вопрос про "почему именно такая структура классов и параметров шаблонов" - не надо задавать Улыбаюсь Мне так нужно.)

пусть изначально имеется такой набор классов

Код: (C++)
//тип, введённый для возможности специализации шаблона A (см далее)
struct s_VOID
{
};

Код: (C++)
//A - работает с двумя параметрами
template<class PARAM1,class PARAM2>
struct A
{
        PARAM1 m_p1;
        PARAM2 m_p2;

        //реализация A
        //...
};

//B - работает с первым параметром
template<class PARAM1,class T2>
//template<class PARAM1>
struct B
{
        PARAM1 m_p1;

        //реализация B
        //...
};

//C - работает со вторым параметром
template<class T1,class PARAM2>
//template<class PARAM2>
struct C
{
        PARAM2 m_p2;

        //реализация C
        //...
};


объявление трёх переменных с РАЗНЫМИ именами шаблонов
Код: (C++)
A<int   ,char  > a;
B<short ,s_VOID> b;
C<s_VOID,long  > c;


И ЧЕГО ХОЧЕТСЯ ДОБИТЬСЯ

Код: (C++)
//тип, введённый для возможности специализации шаблона A (см далее)
struct s_VOID
{
};


объявление трёх переменных с ОДНИМ именем шаблона - A
Код: (C++)
A<int   ,char  > a;
A<short ,s_VOID> b;
A<s_VOID,long  > c;


для этого нужно как-то так задать специализацию A.

пробую вот так, но компилятор не пропускает

Код: (C++)
template<class PARAM1,s_VOID m_p2>
struct A
{
        PARAM1 m_p1;

        //реализация B
        //...
};

template<s_VOID m_p1,class PARAM2>
struct A
{
        PARAM2 m_p2;

        //реализация C
        //...
};

что нужно подправить ? Или такая вещь невозможна ?
« Последнее редактирование: 22-08-2012 06:39 от Алексей1153++ » Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 22-08-2012 05:35 » 

Вижу.

Ты сперва объясни, что ты хочешь добиться.

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

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 22-08-2012 05:38 » 

ещё предположил, что вот так будет более правильно объявить
Код: (C++)
A<int     ,char    > a;
A<short   ,s_VOID()> b;
A<s_VOID(),long    > c;
но это не спасло

Цитата
Ты сперва объясни, что ты хочешь добиться.
так я написал - чтобы использовалось одно и то же имя шаблона плюс одинаковое количество параметров

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

« Последнее редактирование: 22-08-2012 05:51 от Алексей1153++ » Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 22-08-2012 05:44 » 

Код: (C++)
template <class T1, class T2>
struct S
{
  // ... общее
};

struct A : public S <int, char>
{
  // ... специфичное для A
};

struct B : public S <short, s_VOID>
{
  // ... специфичное для B
};

struct C : public S <s_VOID, long>
{
  // ... специфичное для C
};
« Последнее редактирование: 22-08-2012 05:46 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 22-08-2012 05:45 » 

при объявлении экземпляров имена классов шаблонов будут разные.  Это в самом начале поста у меня и показано - без наследования
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 22-08-2012 05:47 » 

С шаблонами у тебя и так будут разные классы. На то он и шаблон. Это же уровень препроцессора.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 22-08-2012 05:50 » 

для функций-шаблонов такой фокус возможен (специализация то есть по типу).

Вот я и спрашиваю - возможно ли это для шаблона класса ?  Если нет, то вопрос снят
Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 22-08-2012 05:51 » 

Слабо понял проблему. Особенно в части сохранения количества параметров. Специализация именно что определяет какие-то параметры и сокращает количество свободных (неопределённых).

Поэтому вот в этом месте поподробнее.

Вот частичная специализация.
Код: (C++)
#include <iostream>

using namespace std;

template<class T, class S>
struct A
{
  void f()
  {
    cout << "A" << endl;
  }
};

struct B
{
};

template<class S>
struct A<B, S>
{
  void f()
  {
    cout << "C" << endl;
  }
};

int main()
{
  A<int, int> a1; a1.f(); // A
  A<B, int>   a2; a2.f(); // C
  return 0;
}
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 22-08-2012 05:59 » 

Dimka,
мне нужно использовать одно имя шаблона при объявлении экземпляра, но в результате использовать разные классы в зависимости от подстановки типа-"маркера" s_VOID

Dimka,  по поводу примера - вижу, что у меня в синтаксисе ошибка, то есть нужно вот как-то так

Код: (C++)
//для B
template<class PARAM1/*,s_VOID m_p2*/>
struct A<PARAM1,int>
{
        PARAM1 m_p1;

        //реализация B
        //...
};

а вот с C проблема - тоже один параметр остаётся. Не отличить от B


Добавлено через 1 минуту и 29 секунд:
то есть, прихожу к тому, что имена придётся оставить разные - как в самом первом моём варианте. Не страшно, но чуток неудобно (

Добавлено через 3 минуты и 25 секунд:
а вот тут, насколько я понимаю, у тебя опечатка ?
Цитата
A<B, int>   a2; a2.f(); // C
« Последнее редактирование: 22-08-2012 06:04 от Алексей1153 » Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 22-08-2012 06:21 » 

Алексей1153++, никаких у меня опечаток нет. Возьми мой код, скомпилируй и запусти.

Если тебе видятся там ошибки и опечатки, значит ты не "вкурил" написанное. Улыбаюсь

P.S. Я компилировал GCC 4.2.1.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 22-08-2012 06:35 » new

!!!

всё, допёрло )  Ошибки у меня были в синтаксисе, нужно так было сделать


Код: (C++)
template<class PARAM1>
struct A<PARAM1,s_VOID>
{
        PARAM1 m_p1;

        //реализация B
        //...
};

template<class PARAM2>
struct A<s_VOID,PARAM2>
{
        PARAM2 m_p2;

        //реализация C
        //...
};

Код: (C++)
A<int   ,char  > a;
A<short ,s_VOID> b;
A<s_VOID,long  > c;


благодарю )  Сейчас опробую на живом

Добавлено через 21 минуту и 44 секунды:
отлично работает )
« Последнее редактирование: 22-08-2012 06:56 от Алексей1153 » Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines