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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Единый экземпляр метода для темплейта 
V
    Опции темы
Ivan.
  Дата 4.9.2007, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если у шаблонного класса есть метод, то когда я создам несколько объектов с разными параметрами темплейта - у меня создастся несколько экземпляров тела метода в памяти кода.
а как сделать так, чтобы метод был только один, как бы темплейт не сложился?
пример:
Код

template<class From, class To, class Temp, u16 size>
class TConvert
{
public:
    u16 Size;
    struct TData{
        From ArgMin, ArgMax;
        To   ValMin, ValMax;
    } Data[size];
    To Get(From Value);
};
//---------------------------------------------------------------------------
template<class From, class To, class Temp, u16 size>
To TConvert<From, To, Temp, size>::Get(From Value)
{
    return .....;
}

код метода не зависит от параметра "size", по этому необходимо чтобы для любого "size" был один единый метод, а для разных параметров "From", "To" или "Temp" метод размножался.


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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



используй наследование. Метод запихай в базовый класс.
PM   Вверх
archimed7592
Дата 4.9.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(Ivan. @  4.9.2007,  13:12 Найти цитируемый пост)
код метода не зависит от параметра "size", по этому необходимо чтобы для любого "size" был один единый метод, а для разных параметров "From", "To" или "Temp" метод размножался. 

А чем вызвана такая необходимость? В методе присутствуют статические переменные? Если нет, то какая тебе разница? Ну будет несколько экземпляров кода ф-ции в бинарнике, но, учитывая то, что более-менее умный компилятор сам по себе встраивает(inline) некоторые ф-ции, то такое явление может иметь место и для нешаблонных ф-ций.


--------------------
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   Вверх
Daevaorn
Дата 4.9.2007, 16:45 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



А если учесь что умные компиляторы очень часто мержат шаблоны, то вообще проблемы высосана из пальца

PM MAIL WWW   Вверх
bsa
Дата 4.9.2007, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Имхо, Ivan. ты сам себя перехитрил. В данном случае не нужно ставить size в качестве параметра шаблона, а память под data выделять и освобождать надо в конструкторе и деструкторе соответственно.
PM   Вверх
Ivan.
Дата 5.9.2007, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я ожидал все эти ответы, спосибо. Но проблема не из пальца, а из 128кБ памяти кода. экономить приходиться везде (это раз).
Второе: выделение памяти не канает, потому как бъект такого класса должен создаваться и заполняться на этапе компиляции и лежать в памяти кода (const), тоесть инициализироваться через фигурные скобки. Отсуда и третья проблема - нельзя наследовать (наследование не инициализируется через фигурные скобки).
Пример:
Код

TConvert<u16, u16, u32, 3> PROGMEM Convert = {3, {{0, 100, 0, 100}, {100, 200, 100, 300}, {200, 300, 300, 1000}}};



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


Опытный
**


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

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



Придумал
Код

template<class From, class To, u16 size>
class TConvert
{
public:
    To _Convert(From Value);
    From _DeConvert(To Value);
    u16 Size;
    struct TData{
        From ArgMin, ArgMax;
        To   ValMin, ValMax;
    } Data[size];
    To Convert(From Value) { return ((TConvert<From, To, 1> *)this)->_Convert(Value); }
    From DeConvert(To Value) { return ((TConvert<From, To, 1> *)this)->_DeConvert(Value); }
};
//---------------------------------------------------------------------------
template<class From, class To, u16 size>
To TConvert<From, To, size>::_Convert(From Value)
{
    return ...;
}
//---------------------------------------------------------------------------
template<class From, class To, u16 size>
From TConvert<From, To, size>::_DeConvert(To Value)
{
    return ...;
}
//---------------------------------------------------------------------------


Это сообщение отредактировал(а) Ivan. - 5.9.2007, 11:02


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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