Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Типы и их соответствия из С++ в Си  (Прочитано 9060 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Loki
Участник

ru
Offline Offline

« : 23-10-2008 13:24 » 

Какому типу соответствует этот шаблон класса 'C'?
Код:
template <class C>
void type(C &c){
c(id)(dir)(len)(time);
}
как подобнобное портировать с Си++ на Си?
класс будт выглядить как структура, а вот с типом что-то не ясно А черт его знает...
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 23-10-2008 13:31 » 

В С нету шаблонов. Тебе придется для каждого типа писать отдельный класс.


Мне кажется, бред.
Код:
c(id)(dir)(len)(time);
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 23-10-2008 14:55 » 

Цитата: Finch
В С нету шаблонов. Тебе придется для каждого типа писать отдельный класс.
Так и классов нету. Только структуры есть.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 23-10-2008 18:44 » 

dimka, Упс. Ну мы поняли наверно друг друга Улыбаюсь
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #4 : 24-10-2008 04:44 » 

Loki, однако припоминаю тему на rsdn. Твоя работа?

1. в C нет шаблонов
2. нет классов
3. нет перегрузок оператора ()

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

Код:
void type(someType*t, id, dir, len, time)
{
    setTime(setLlen(setDir(setID(t, id), dir), len), time);
}

какой именно тип возвращает set ты поймёшь проанализировав перегрузку ()

..................
Мне кажется, бред.
Код:
c(id)(dir)(len)(time);

Ну на самом деле вполне обычный код ничего выдающегося или бредового просто захотелось людям перегрузить оператор ().
Записан

Странно всё это....
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 24-10-2008 05:58 » 

Цитата
Ну на самом деле вполне обычный код ничего выдающегося или бредового просто захотелось людям перегрузить оператор ().
Offtopic:

руки бы обрывал наказывал бы за такие конструкции, ибо выпендрёж, а потомкам разбираться. Тогда уж лучше <<, хоть сразу понятно, что обо всём этом думать...


В целом согласен с LogRus: либо разруливаешь дело реализацией набора функций, либо реализуешь работу со структурами в макросах. Дело вкуса Улыбаюсь
Записан
Loki
Участник

ru
Offline Offline

« Ответ #6 : 24-10-2008 09:00 » 

А зачем может понадобиться подобная перезагрузка опираторов?
Дело в том, что у меня есть некая структура, а этот класс типа "С" находится уже в этой структуре и дальше происходит работа с этим классом как со структурой используя эти перезагружаемые опираторы.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #7 : 24-10-2008 09:04 » 

Loki, покажи пример, чёта нифига не понятно Улыбаюсь
Записан

Loki
Участник

ru
Offline Offline

« Ответ #8 : 24-10-2008 14:05 » 

Код:
struct data{
int id;
char dir;
u32 len;
u16 time;
bool operator<(const data& c) const{
   if(len>0) return 1;
   if(tile>0) return 1;
   return 0;
}
template <class C>
void type(C &c){
c(id)(dir)(len)(time);
}
}
bool я переписал в функцию
int my_bool(const data *c){
   if(len>0) return 1;
   if(tile>0) return 1;
   return 0;
}
а вот с остальным вышел тормоз
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 24-10-2008 14:26 » 

Цепочку вызовов в С можно реализовать как набор функций, возвращающих указатели на функции.

Код:
typedef int (*time_func)(int time);
 typedef time_func (*len2time_func)(int len);
 typedef len2time_func (*dir2len_func)(int dir);
 typedef dir2len_func (*id2dir_func)(int id);


 int time_func_impl(int time) { return time; }
 time_func len2time_func_impl(int len) { return time_func_impl; }
 len2time_func dir2len_func_impl(int dir) { return len2time_func_impl; }
 dir2len_func id2dir_func_impl(int id) { return dir2len_func_impl; }

 int main() {
         id2dir_func c = id2dir_func_impl;

         return c(1)(2)(3)(4);
 }
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Loki
Участник

ru
Offline Offline

« Ответ #10 : 25-10-2008 03:07 » 

Цитата
Цепочку вызовов в С можно реализовать как набор функций, возвращающих указатели на функции.
Как-то много тогда всего получится.
Вад
Цитата
реализуешь работу со структурами в макросах.
с макросами понятно, как со структурами быть?
Или может вообще не смысла переписавать перезагрузки, а просто юзать объекры структуры data? Просто я никак не могу понять зачем нужна эта перезагрузка.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #11 : 25-10-2008 04:55 » 

а я вот не вижу смысла в такой конструкции,
c(id)(dir)(len)(time);

скажи на словах - что нужно добиться то ? Улыбаюсь Просто инициализация ? "Удобство" вычисления ? Чемь это удобно и как это отлаживать ?
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 25-10-2008 08:09 » 

Или может вообще не смысла переписавать перезагрузки, а просто юзать объекры структуры data? Просто я никак не могу понять зачем нужна эта перезагрузка.
Перегрузки ведь чисто для удобства используются. Всё равно ты в C не можешь рассчитывать на подобную С++ простоту инкапсуляции данных. Поэтому проще всего писать в процедурном стиле, без всех этих акробатик вроде возврата указателя на функцию.

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

Если полиморфизм даром не сдался, то хватит и обычных функций. Максимум, можно сделать функции с возвратом указателя на данные в качестве результата. То есть
Код:
C* setCId(C* data, ID id)
{
   //...
   return data;
}

C* setCDir(C* data, DIR dir)
{
   //...
   return data;
}

void main()
{
   C test;
   ID id;
   DIR dir;
   //...
   setCDir( setCId( &C, id ), dir );
   // or
   setCId( setCDir( &C, dir ), id );
}
Так довольно часто делают, насколько мне это доводилось видеть. Имхо, не худший вариант.
Записан
Loki
Участник

ru
Offline Offline

« Ответ #13 : 25-10-2008 13:06 » 

Цитата
Перегрузки ведь чисто для удобства используются.
Хе хе, вот же удобства все заново переписывать при переносе на си=)))
Ладно, в прнципе что хотел узнать, узнал, всем спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines