Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> friend class template 
:(
    Опции темы
Ivan.
  Дата 29.10.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Как расшарить методы для схожего шаблонного класса:
Код

template<class T, int Size>
class TBase
{
private:
        int Count
        T Data[Size];
protected:
        int _Find(T Value);
public:
        inline int Find(T Value) { return ((TBase<T, 1> *)this)->_Find(Value); }
        TBase() :Count(Size){}
}

В данном случаи преведение к TBase<T, 1>  дает нам объединение тел метода Find для различных выриантов Size, но метод _Find закрыт для класса например TBase<T, 5>
Создавать друзей для всех вариантов Size сами понимаете...
Как бы сделать типа:
Код

        template<int _Size>
        friend class TBase<T, _size>;



--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
archimed7592
Дата 29.10.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Ivan. @  29.10.2007,  14:02 Найти цитируемый пост)
protected:
        int _Find(T Value);

Раз он не зависит от Size, то вынести в базовый класс.

Добавлено через 2 минуты и 12 секунд
Или, если это не приемлемо(вспоминается, что у тебя там какие-то проблемы с базовыми классами), то в non-member ф-цию(которую сделать friend'ом TBase<T, 1>.


Цитата(Ivan. @  29.10.2007,  14:02 Найти цитируемый пост)
((TBase<T, 1> *)this)

Лучше
Код
reinterpret_cast< TBase< T, 1 > * >(this)



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
akizelokro
Дата 29.10.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Боюсь, что такого рода вызов 

Код

inline int Find(T Value) { return ((TBase<T, 1> *)this)->_Find(Value); }


применительно к объекту TBase<T, 5> приведет к ошибке даже с использованием friend.
Ты можешь просто сделать дружественную функцию

Код

template<class T, int S> (T value)  { return ((TBase<T, S> *)this)->_Find(Value); }

template<class T, int Size>
class TBase
{
public:
        int _Find(T Value);
friend int Find<T, Size> (T value);
либо можно попытаться попробовать сделать другом сам класс-шаблон, но несвязанный по параметрам

Код

template<class T, int Size>
class TBase
{
public:
        int _Find(T Value);
friend class TBase<Type, S> Find(T value);

А впрочем, здесь уже и public не нужен.

Это сообщение отредактировал(а) akizelokro - 29.10.2007, 14:57


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Ivan.
Дата 29.10.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



с наследованием у меня действительно проблемы, точнее не у меня а у C++, так как дочерний класс нельзя инициализировать через {...}.
А со вторым способом я чтото не допонял, можно по подробней?


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
akizelokro
Дата 29.10.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Не уверен, что reinterpret_cast здесь будет работать.


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
archimed7592
Дата 29.10.2007, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(akizelokro @  29.10.2007,  14:37 Найти цитируемый пост)
применительно к объекту TBase<T, 5> приведет к ошибке даже с использованием friend.

Почему? Ну если брать не мифическое ограничение стандарта, а реальные реализации...

Цитата(akizelokro @  29.10.2007,  14:53 Найти цитируемый пост)
Не уверен, что reinterpret_cast здесь будет работать.

0_о.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
akizelokro
Дата 29.10.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



У функции _Find не видно спецификатора const. smile вот что я подразумеваю, почему reinterpret_cast может привести к довольно неожиданным результатам для самого программиста. Тем более, что меня всегда учили, что использовать явные преобразования нужно в крайних случаях. Здесь же есть более простые решения, и, скорее всего, не одно. 

более поздняя мысль.

Код

((TBase<T, 1> *)this)->_Find(Value); 


кажется мне не приемлемой идеей. Если, предположим, функция _Find реализована в виде

Код

for(int i = 0; i < SIZE; ++i)
  if (Data[i] == value)
    Result++;

то, может статься  smile  в результате явного приведения к типу TBase<T, 1> указателя на объект класса TBase<T, 5> цикл отработает всего одну итерацию. Хмык.

Это сообщение отредактировал(а) akizelokro - 29.10.2007, 15:38


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Ivan.
Дата 30.10.2007, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Цитата(akizelokro @  29.10.2007,  15:11 Найти цитируемый пост)
for(int i = 0; i < SIZE; ++i)
  if (Data[i] == value)
    Result++;

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

В-третих я нихрена не понял ваши дружественные функции и т.д.


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
akizelokro
Дата 30.10.2007, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Пример, который я привел, всего лишь пример, с помощью которого я на пальцах хотел показать опасность применения reinterpret_cast в данном конкретном случае шаблона с параметром-значением. Ты можешь его применять, но должен разбираться в последствиях, к чему это может привести. Base<T,1> - тип, отличный от Base<T, 5> и желательно работать с ними как с разными типами.

Про friend функцию или класс. В чем у тебя закавыка? Как объявлять функцию или класс дружественной, все знают. В случае шаблонов это немного усложняет запись. С учетом того, что Base<T, 1> и Base<T, 5> разные типы (примитивно говоря), ты можешь делать дружественными функцию или класс со связанными или несвязанными параметрами.

template<class T, int SIZE>
class Base
{
  friend int Find<T, SIZE> (T value); //дружественная функция со связанными параметрами T == T, SIZE == SIZE
  friend class Anything<Type, S>; // несвязанные параметры, T != Type, SIZE != S
}


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
archimed7592
Дата 30.10.2007, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(akizelokro @  30.10.2007,  08:30 Найти цитируемый пост)
  friend int Find<T, SIZE> (T value); //дружественная функция со связанными параметрами T == T, SIZE == SIZE

Хорошо было бы ещё передавать ей некое подобие this(иначе от дружественности большого толку не будет).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
akizelokro
Дата 31.10.2007, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Find<T, 1> ( *( this->Data ) )?  smile 


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.