Easyelectronics.ru

Электроника для всех
Текущее время: 07 июл 2020, 22:02

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: C++ Шаблоны
СообщениеДобавлено: 02 ноя 2018, 13:48 
Здравствуйте!

Зарегистрирован: 02 ноя 2018, 13:25
Сообщения: 2
Добрый день.
Начал изучать плюсы и возник следующий вопрос.

Есть шаблонный класс:
Код:
template<int i>
class A{
    ...
    fooA();
    ...
};


Хочется создать второй шаблонный класс такого вида:
Код:
template<A a>
class B{
    ...
    fooB(){ a.fooA();}
    ...
};


И в конечном итоге получить:
Код:
...
A<1> a;
B<a> b;
...


Как правильно описать второй класс B и создать объект этого класса?
(Если переходить к частному случаю, то хочу создать класс GPIO - A и класс LED - B).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++ Шаблоны
СообщениеДобавлено: 02 ноя 2018, 14:00 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1204
В шаблон не передаются объекты, только константы или типы, т.е. можно сделать так:
Код:
using a = A<1>;
B<a> b;

А внутри B будет
Код:
fooB(){ a::fooA();}

естественно fooA() должен быть статическим. Или, в противном случае, придется внутри B создавать объект на основе переданного типа. Для класса GPIO это излишне, там все можно делать статическим.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++ Шаблоны
СообщениеДобавлено: 29 дек 2018, 09:05 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2570
Не могу заставить Segger IDE работать с STL (библиотека стандартных шаблонов).
Действовал по инструкции

Цитата:
To use an external standard library, such as newlib, you can disable the use of the Embedded Studio libraries in the the project options at Linker -> Library.

The C++ STL functionality of STLPort 5.1.0 is provided in SEGGER Embedded Studio. To use STLPort you must put $(StudioDir)/include/stlport as the first entry in the User Include Directories project property. The STLPort is configured to not support long doubles and iostreams.

Since STLPort is kindof old now and not well maintained there will be an update of the STL in Embedded Studio with one of the next versions to also support newer versions of C++.


Не нашел в параметрах Linker пункта Library
Такой пункт есть на вкладке Code
ставил параметр Include Standart Libraries и в Yes и в No - результат один, ругается конфликт деклараций функции
long abs(long int)


Что где недонастроил?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++ Шаблоны
СообщениеДобавлено: 29 дек 2018, 09:57 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2570
Решил проблему!
Что называется - "сам дурак".
Разместил #include <map> в обрамлении для подключения Си-шных библиотек по невнимательности.

#ifdef __cplusplus
extern "C" {
#endif




#ifdef __cplusplus
}
#endif

Вытащил его от туда и проект собрался.
Буду пробовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++ Шаблоны
СообщениеДобавлено: 22 фев 2019, 21:08 
Здравствуйте!

Зарегистрирован: 27 июн 2016, 23:47
Сообщения: 4
Добрый день. Есть условный шаблон класса
Код:
template <int xSize, int ySize>
class Matrix
{
   int m_array[xSize][ySize];
public:
   int get (int x, int y)   {   return m_array[x][y];   }
};
Есть другой шаблон класса, среди параметров этого шаблона должна быть ссылка на объект первого класса (non-type параметр).
Ссылок на шаблон класса не существует, приходится писать что-то подобное и явно указывать параметры шаблона при создании объектов:
Код:
template <int xSize, int ySize, Matrix<xSize, ySize> &matrix >
class MatrixUser
{
   // .....
};
Matrix <10, 15> testMatrix;
MatrixUser <10, 15, testMatrix> testMatrixUser;
Вопрос: Как правильно определить шаблон класса MatrixUser, чтобы последняя строчка свелась к
Код:
MatrixUser <testMatrix> testMatrixUser;
И возможно ли это в принципе?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++ Шаблоны
СообщениеДобавлено: 22 фев 2019, 21:48 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2732
Откуда: Санкт-Петербург
decltype. Но я не мастер в этом, предпочитаю по возможности ограничиваться "си с классами" и простыми темплейтами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++ Шаблоны
СообщениеДобавлено: 22 фев 2019, 23:22 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1204
В С++17 можно использовать auto:
Код:
template<auto& matrix>
class MatrixUser


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++ Шаблоны
СообщениеДобавлено: 22 фев 2019, 23:32 
Только пришел

Зарегистрирован: 03 сен 2017, 22:47
Сообщения: 27
это должно выглядеть так?

Код:
template <int xSize, int ySize>
class TMatrix
{
   // .....
};

template <class Matrix>
class TMatrixUser
{
   // .....
};

typedef TMatrix <10, 15> testMatrix;
typedef TMatrixUser <testMatrix> testMatrixUser;

если да, посмотри здесь:
https://ru.files.fm/u/cf4jjthd#/list/
в архиве uC_cpp.7z файл "C++ для 'самых маленьких'.pdf" стр.15


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++ Шаблоны
СообщениеДобавлено: 24 фев 2019, 00:40 
Здравствуйте!

Зарегистрирован: 27 июн 2016, 23:47
Сообщения: 4
Не совсем. В данном случае вся работа проводится с типами, я же хотел работать с объектами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++ Шаблоны
СообщениеДобавлено: 25 фев 2019, 10:59 
Заглядывает иногда

Зарегистрирован: 30 июн 2015, 14:16
Сообщения: 56
День добрый, в keil сделал шаблон - класс list.
Код:
template <class T>
class List {
struct Item
{
   T * object;
   Item * next;
   Item (T *o, Item * n = nullptr)
      :object(o), next (n)
   {}
   //{object = o; next = n;}
};
   Item * first;
   Item * last;
   uint16_t count;
public:
   List();
   ~List();
   T* head () const {return first->object;}
   T* tail () const {return last->object;}
   void addFirst (T *);
   void addLast (T *);
   uint16_t & getCount (){return count;}
};

template <class T>
List<T>::List(){
   count = 0;
   first = last = nullptr;
   first->next = last;
}

template <class T>
List<T>::~List(){
   Item * temp = nullptr;
   Item * next = first;
   while (next->next != nullptr)
   {
      temp = next;
      next = next->next;
      delete temp;
   }
   temp = last;
   delete temp;
}
template <class T>
void List<T>::addLast (T * o)
{
   Item * newItem = new Item (o);
   if (first == nullptr){
      first = newItem;
   }else{
      if (last == nullptr){
         last = newItem;         
      }else{
         last->next = newItem;
      }
   }
   ++count;
}   

код программы

Код:
int numbers[5] = {10, 10, 5, 4,0};
int main (){
    List <int> inputs;
    inputs.addLast (numbers);
    inputs.addLast (&numbers[1]);
    inputs.addLast (&numbers[2]);
   while(1){
      
   }
}


Почему-то код распух почти до 13кВ сразу после создания экземпляра класса List. Добавление элементов добавляют размер незначительно? Что-то делаю не так?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++ Шаблоны
СообщениеДобавлено: 25 фев 2019, 11:18 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 681
Откуда: Германия
А что значит "распух"? До этого в коде ничего не было? Подозреваю, что все дело вот в этой строчке:

creator83 писал(а):
Код:
Item * newItem = new Item (o);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++ Шаблоны
СообщениеДобавлено: 25 фев 2019, 11:37 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2732
Откуда: Санкт-Петербург
+1. new и вся инфраструктура для него - вам точно это надо на мк? Не говоря уже про связные списки с выделением под каждый узел - они используются примерно никогда (да, и на больших компах тоже)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++ Шаблоны
СообщениеДобавлено: 25 фев 2019, 12:16 
Заглядывает иногда

Зарегистрирован: 30 июн 2015, 14:16
Сообщения: 56
aamonster писал(а):
+1. new и вся инфраструктура для него - вам точно это надо на мк? Не говоря уже про связные списки с выделением под каждый узел - они используются примерно никогда (да, и на больших компах тоже)


Такое потребление ресурсов для данной конструкции это норма? Или где-то в настройках keil что-то не корректно задано?

dev писал(а):
А что значит "распух"? До этого в коде ничего не было? Подозреваю, что все дело вот в этой строчке:


Без этой конструкции меньше 1кВ код

Вынес класс Item, получился следующий код

Код:
#include "device.h"                  // Device header
#include "pin.h"

Pin buttonMassage (port::A, 0);
Pin buttonFall (port::A, 1);
Pin buttonGeyser (port::A, 2);
class Item
{
   public:
   Pin * object;
   Item * next;
   Item (Pin  *o, Item * n = nullptr)
      :object(o), next (n)
   {}
};

int main (){
        Item * input1= new Item (&buttonMassage);
   Item * input2 = new Item (&buttonFall, input1);
   Item * input3 = new Item (&buttonGeyser, input2);
   while(1){
      
   }
}


размер кода следующий:
Program Size: Code=564 RO-data=208 RW-data=0 ZI-data=1672

Совсем стало не понятно


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++ Шаблоны
СообщениеДобавлено: 25 фев 2019, 13:06 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 188
creator83 писал(а):
Такое потребление ресурсов для данной конструкции это норма?

Сохраните map-файл для билда "без конструкции", а потом "с конструкцией" - при сравнении этих мап-файлов увидите что добавилось.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++ Шаблоны
СообщениеДобавлено: 25 фев 2019, 15:18 
Только пришел

Зарегистрирован: 03 сен 2017, 22:47
Сообщения: 27
"new" в main компилятор скорее всего оптимизировал, т.к. известно количество создаваемых объектов + объекты не используются


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB