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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "Статические" контейнеры 
V
    Опции темы
Alek86
Дата 12.1.2008, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

наверное, запутал. поясню

к примеру, если вектор может хранить указатели на интерфейс и работать с элементами (реализации интерфейса) с помощью динамическорго полиморфизма:
Код


struct Interface {
// ...
  void Func1() = 0;
// ...
};

struct Class1 : public Interface {/*realization*/};
struct Class2 : public Interface {/*realization*/};
struct Class3 : public Interface {/*realization*/};

// ...

std::vector<Interface*> vect;

vect.push_back(new Class1);
vect.push_back(new Class2);
vect.push_back(new Class3);
BOOST_FOREACH(Interface* p, vect) {
  p->Func1();
}


то "статический" контейнер хранит шаблоны и работает с конкретизациями шаблона (на этапе компиляции, конечно)


ну и сами вопросы - как это называется, есть ли такое в бусте (сам бы поискал, если б знал, что искать), и если нет, то где есть?


--------------------
user posted image    user posted image
PM MAIL   Вверх
bsa
Дата 12.1.2008, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Если честно, я не понял, что ты хочешь. И, главное, зачем. Может тебе нужен boost::tuple?
Я под статическим контейнером понимаю, например, тот же vector, элементы которого задаются на этапе компиляции (проще говоря, обычный статический массив с интерфейсом от, например, std::vector).
PM   Вверх
Alek86
Дата 12.1.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



я не хочу использовать виртуальных функций иам, где этого можно избежать

если у меня есть ровно 3 однородных (то есть имеющих одинаковую функциональность) элемента, то, для их "одинаковой" обработки хотелось бы поместить их в контейнер и работать со всем контейнером.
Можно, конечно, их унаследовать от одного интерфейса и запихнуть в вектор, но при этом будет некоторое замедление работы из-за вызова функций через таблицу вирт. функций.
Но зачем мне это нужно, если я точно знаю, что сейчас , к примеру,  для 1го элемента контейнера мне нужно вызвать "оту" функцию, а для второго - "именно оту"?
потому и хочу тут прикрутить не динамический полиморфизм, а статический. И потому хотелось бы контейнер, который будет не на этапе работы программы смотреть, какую же ему функцию вызвать, а подставлять ее вызов уже на этапе компиляции.


--------------------
user posted image    user posted image
PM MAIL   Вверх
Daevaorn
Дата 12.1.2008, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Alek86 @  12.1.2008,  13:26 Найти цитируемый пост)
Можно, конечно, их унаследовать от одного интерфейса и запихнуть в вектор, но при этом будет некоторое замедление работы из-за вызова функций через таблицу вирт. функций.

У тебя старый микроконтроллер? Профайлер показал, что самое слабое место программы это вызов виртуальных методов?
Цитата(Alek86 @  12.1.2008,  13:26 Найти цитируемый пост)
Но зачем мне это нужно, если я точно знаю, что сейчас , к примеру,  для 1го элемента контейнера мне нужно вызвать "оту" функцию, а для второго - "именно оту"?

Здается мне, что у тебя что-то не то с дизайном. Разнородные сущности в одном контейнере - это настораживает.
Цитата(Alek86 @  12.1.2008,  13:26 Найти цитируемый пост)
потому и хочу тут прикрутить не динамический полиморфизм, а статический. И потому хотелось бы контейнер, который будет не на этапе работы программы смотреть, какую же ему функцию вызвать, а подставлять ее вызов уже на этапе компиляции. 

как уже сказали boost::tuple. Но по большому счету это бред.
PM MAIL WWW   Вверх
Alek86
Дата 12.1.2008, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Daevaorn @  12.1.2008,  13:32 Найти цитируемый пост)
Профайлер показал, что самое слабое место программы это вызов виртуальных методов?

допустим

Цитата(Daevaorn @  12.1.2008,  13:32 Найти цитируемый пост)
Разнородные сущности в одном контейнере - это настораживает.

хм...
Цитата(Alek86 @  12.1.2008,  12:26 Найти цитируемый пост)
если у меня есть ровно 3 однородных


Цитата(Daevaorn @  12.1.2008,  13:32 Найти цитируемый пост)
как уже сказали boost::tuple. Но по большому счету это бред.

boost::tuple насколько я понял, содержит как раз абсолютно разнородные сущности
хотя можно его и специализировать, возможно... за подсказку спасибо обоим

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

Добавлено @ 13:53
в общем, я спрашивал, знает ли кто-то о таком, а не просил рассказать мне, что нет ситуаций, когда это может пригодиться...
ситуацию я привести могу, так как с ней столкнулся, но на объяснение ее уйдет много букв smile

Это сообщение отредактировал(а) Alek86 - 12.1.2008, 13:55


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 12.1.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Alek86 @  12.1.2008,  12:26 Найти цитируемый пост)
Можно, конечно, их унаследовать от одного интерфейса и запихнуть в вектор, но при этом будет некоторое замедление работы из-за вызова функций через таблицу вирт. функций.

заповедь первая - не оптимизируй!)))
На этапе компиляции никакие ф-ии не вызываются, можно только константы и типы вычислять. Можно на этапе компиляции создавать списки типов, векторы типов, и тд.. смотри boost::mpl.
там можно написать так:
Код

typedef boost::mpl::vector<int, double, std::string> my_types;

....
статический полиморфизм можно использовать толко тогда, когда у тебя известен тип на этапе компиляции
Код

template<typename T>
struct MyStruct
{
  T *p;
  MyStruct(T* t) : p(t) { p->Function(); }
};

если ф-я Function является обычной (не виртуальной), то это статичесский польморфизм... адрес ф-ии будет известен на этапе компиляции, вместо этого можно было-бы использовать виртуальные ф-ии и указатель на базовый класс.

PM MAIL Skype GTalk   Вверх
Alek86
Дата 12.1.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Lazin @  12.1.2008,  14:49 Найти цитируемый пост)
На этапе компиляции никакие ф-ии не вызываются

я про вызов и не говорил, а про подстановку

Цитата(Lazin @  12.1.2008,  14:49 Найти цитируемый пост)
если ф-я Function является обычной (не виртуальной), то это статичесский польморфизм...

 smile вот его и хотелось использовать
похоже, это можно сделать с помощью mpl::for_each



--------------------
user posted image    user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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