Russian Qt Forum
Ноябрь 25, 2024, 06:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Инициализация массивов в template  (Прочитано 5889 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Декабрь 20, 2017, 11:44 »

Добрый день

Для примера есть простой статычный темплейт массив
Код
C++ (Qt)
template <class T>
struct TArray<T, size_t num> {
 TArray( void )
 {
   ???
 }
 
 T & operator[] ( size_t index );
 
private:
 T mData[num];
}
Теперь если T будет классом с конструктором - он, как положено, вызовется для каждого эл-та массива. Но если T простой POD тип (напр int или double) - эл-ты останутся "с мусором". Конечно можно прописать их в конструкторе TArray, но тогда получим избыточность в первом случае.

Не скажу что это "великая проблема" Улыбающийся, но все-таки интересно как сделать аккуратно.

Спасибо


« Последнее редактирование: Декабрь 20, 2017, 11:46 от Igors » Записан
ksk-
Самовар
**
Offline Offline

Сообщений: 178



Просмотр профиля
« Ответ #1 : Декабрь 20, 2017, 12:47 »

Можно применить std::is_pod
Записан
ksk-
Самовар
**
Offline Offline

Сообщений: 178



Просмотр профиля
« Ответ #2 : Декабрь 20, 2017, 12:50 »

А если есть 17-е плюсы, то вообще красиво получится. ))
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #3 : Декабрь 20, 2017, 17:34 »

Код
C++ (Qt)
#include <iostream>
using namespace std;
 
template <class T, size_t num>
struct TArray
{
   T& operator[](size_t index) { return mData[index]; }
 
private:
   T mData[num];
};
 
int main()
{
   TArray<int, 5> a;
   cout << "Uninitialized: " << a[0] << endl;
 
   TArray<int, 5> b{};
   cout << "Initialized  : " << b[0] << endl;
 
   return 0;
}
можно mData инициализировать:
Код
C++ (Qt)
private:
   T mData[num]{};

Но лучше использовать std::array(даже вместо mData[num]), или наследоваться от него.
« Последнее редактирование: Декабрь 20, 2017, 20:02 от ViTech » Записан

Пока сам не сделаешь...
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Декабрь 20, 2017, 19:02 »

mData поменять на указатель или std::trat-ta-ta-ptr, тогда можно сделать

Код
C++ (Qt)
mData = new T[num]();
 
Записан
ksk-
Самовар
**
Offline Offline

Сообщений: 178



Просмотр профиля
« Ответ #5 : Декабрь 20, 2017, 20:13 »

Примерно так может выглядеть конструктор (С++17):
Код
C++ (Qt)
TArray()
{
   if constexpr(std::is_pod_v<T>) {
       std::fill_n(std::begin(mData), num, T());
   }
}
 
« Последнее редактирование: Декабрь 20, 2017, 20:15 от ksk- » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Декабрь 21, 2017, 15:43 »

Код
C++ (Qt)
   TArray<int, 5> a;
...
   TArray<int, 5> b{};
}
Ну так отличные шансы ошибиться Улыбающийся, тогда уж лучше потратиться на инициализацию. И эти скобочки С++ 11 ? (MSVC 2012 не кушает)
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #7 : Декабрь 21, 2017, 16:04 »

Ну так отличные шансы ошибиться Улыбающийся, тогда уж лучше потратиться на инициализацию.

Это уже от поставленных задач зависит. Может нужна суперскорость и некогда на пустую инициализацию время тратить Улыбающийся. Для тех кто знает что они делают.

И эти скобочки С++ 11 ? (MSVC 2012 не кушает)

Да, скобочки - это инициализация из braced-init-list в С++11.
Записан

Пока сам не сделаешь...
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #8 : Декабрь 24, 2017, 21:31 »

 TArray( void )
  {
    Непонимающий
  }

Код:
template <class T, size_t N>
struct array
{
    T mData[N] = {};
};
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.15 секунд. Запросов: 22.