Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Единый экземпляр метода для темплейта


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

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" метод размножался.

Автор: bsa 4.9.2007, 13:22
используй наследование. Метод запихай в базовый класс.

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

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

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

Автор: bsa 4.9.2007, 19:49
Имхо, Ivan. ты сам себя перехитрил. В данном случае не нужно ставить size в качестве параметра шаблона, а память под data выделять и освобождать надо в конструкторе и деструкторе соответственно.

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

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

Автор: Ivan. 5.9.2007, 10:49
Придумал
Код

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 ...;
}
//---------------------------------------------------------------------------

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)