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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по шаблонам, произвольные элементы классов в шаблонах 
:(
    Опции темы
Andrej23
Дата 22.10.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Собственно есть такая траблемка: хочу написать общую ф-ию для обработки массива, элементы которого - экземпляры класса. 
Обрабатываю один конкретный элемент по всех ячейках массива (например какой-то элемент типа double).

Загвоздка в том, что хочу закинуть её в библиотеку и использовать для массивов любых классов с любыми членами класса.

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

Код

class Tick  
{
public:
     double  Price, Open,High;
};

Tick ArrTick[50];


template <class X> double LinReg(long index, long Len, X &Arr)
    if (index>Len && Len>0)
    {
        double    Sum1=0,
            SumBars=Len*(Len-1)*0.5,
            SumSqrBars=(Len-1)*Len*(2*Len-1)/6,
            SumY=0;

        for (long x=0;x<Len;x++) {
            Sum1+=x*Arr[index-x].Price;
            SumY+=Arr[index-x].Price;
        }
        double    Sum2=SumBars*SumY,
                Num1=Len*Sum1-Sum2,
                Num2=SumBars*SumBars-Len*SumSqrBars,
                Slope=0;
        if (Num2!=0) Slope=Num1/Num2;
        double    Intercept = (SumY-Slope*SumBars)/Len;
        return Intercept + Slope * (Len-1 + index-index-TargetB);
    }
    else return 0;
}

Если её вызвать, например:
Код

LinReg(25, 10, ArrTick);      //посчитать 10 периодную линейную регрессию (с 16го по 25й элемент .Price ячеек массива  ArrTick[])

функция работает, но обрабатывает только элементы .Price ячейки массива

Чтобы обработать .Open  или .High, нужно переписывать ф-ию.

я смог придумать только это:
Код

template <class X, class Y> double LinRegTempl(long index, long Len, X &Arr, Y &Pole);

а внутри ф-ии уже попробовать заморачиваться с адресом.

Как можно сделать, чтобы при вызове ф-ии указывать еще и название поля ячейки массива, по которым делать расчет?
Например чтобы вызывать ф-ию как-то так:
Код

LinReg(25,10,ArrTick, Price);
LinReg(25,10,ArrTick, Open);
LinReg(25,10,ArrTick, High);


Это сообщение отредактировал(а) Andrej23 - 22.10.2010, 14:31
PM MAIL   Вверх
baldina
Дата 22.10.2010, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 32
Всего: 101



Цитата(Andrej23 @  22.10.2010,  14:20 Найти цитируемый пост)
Как можно сделать, чтобы при вызове ф-ии указывать еще и название поля ячейки массива, по которым делать расчет?
Например чтобы вызывать ф-ию как-то так:
код C++
1:
2:
3:
LinReg(25,10,ArrTick, Price);
LinReg(25,10,ArrTick, Open);
LinReg(25,10,ArrTick, High);



использовать указатели на члены:
Код

LinReg(25,10,ArrTick, &Tick::Price);


Это сообщение отредактировал(а) baldina - 22.10.2010, 14:49
PM MAIL   Вверх
djamshud
Дата 22.10.2010, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

Репутация: 8
Всего: 39



Код

#include<stdio.h>

struct s{
int a;
double b;};

template<typename T,typename Tv,Tv T::*field>
Tv sum(T const *array,size_t len){
Tv res=0;
for(size_t i=0;i<len;i++)
res+=array[i].*field;
return res;}

int main(){
struct s ss[]={{1,2},{4,0.5}};      
double res=sum<struct s,double,&s::b>(ss,sizeof(ss)/sizeof(*ss));
printf("%f\n",res);
return 0;}


Добавлено через 2 минуты и 54 секунды
Ой, опоздал)


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Andrej23
Дата 22.10.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое спасибо обоим ответившим.

Наоборот, очень хорошо, что второй пример подробный, сейчас буду разбираться.

Это сообщение отредактировал(а) Andrej23 - 22.10.2010, 15:55
PM MAIL   Вверх
baldina
Дата 22.10.2010, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 32
Всего: 101



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

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

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

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

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


 




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


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

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