LINUX.ORG.RU

[C++] Чего вам нехватает в языке?

 


0

0

Может бессмысленный топик, но хотелось бы знать мнение: каких фич языка не хватает по вашему в c++?

З.Ы. Убедительная просьба фанатам других языков программирования воздержаться от комментариев.

Ответ на: комментарий от Booster

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

anonymous
()
Ответ на: комментарий от anonymous

Для не русских.

Ну так все же, какие еще могут быть применения у указателя, кроме как быть адресом в памяти?

Ответ был дан.

А теперь опять вопрос - зачем кастовать указатель для получения индекса? Отвечать с примерами кода, или осознать свою ошибку и публично покаяться.

No comments.

Booster ★★
()
Ответ на: комментарий от Booster

Для психически неполноценных:

Ответ был дан.

Удовлетворительного, обоснованного ответа дано не было. Была сказана чушь, после которой кандидат с собеседования вылетает с пинком под зад. Представь себе, что ты грузишь этим бредом потенциального работодателя, и ужаснись.

anonymous
()
Ответ на: комментарий от Booster

Это хорошо, что достал. Может хоть на минуту заставил тебя задуматься о твоём подлом и гнусном поведении.

anonymous
()
Ответ на: комментарий от Begemoth

>> ну массив указателей на функции-то можно создать

зачем?

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

annulen ★★★★★
()
Ответ на: комментарий от Begemoth

> Так ты приведёшь пример кода с преобразованием указателя в int?

typedef int (*fun)(int);
map<fun,MyClass> m;

не?

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от Begemoth

Пример приведи, а то я давно на Win32 API не писал.

UINT_PTR SetTimer(      
    HWND hWnd,
    UINT_PTR nIDEvent, //произвольно можно задать только этот параметр, по сути аналог void*, т.е. некий контекст для колбека
    UINT uElapse,
    TIMERPROC lpTimerFunc
);


VOID CALLBACK TimerProc( // ...она же TIMERPROC
    HWND hwnd,
    UINT uMsg,
    UINT_PTR idEvent, // == nIDEvent
    DWORD dwTime
);

И вот так там всё.

legolegs ★★★★★
()
Ответ на: комментарий от Booster

Вот так и ведут себя все трусливые маленькие лгунишки. Как только их поймают на наглом гоневе, сразу принимают обиженную позу и прячутся в кусты.

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

anonymous
()
Ответ на: комментарий от Booster

Ну, пока что веселишь тут только ты. Указатели к инту и обратно кастовать предлагаешь, когда тебя ловят на лжи, начинаешь очень смешно увиливать и корчить из себя оскорбленную невинность. Очень типичное поведение для малолетнего кретина. И очень забавное. Таких, как ты, можно пинать вечно.

anonymous
()
Ответ на: комментарий от anonymous

> И очень забавное. Таких, как ты, можно пинать вечно

сначала объясни, как ты реализуешь без каста указателя в инт вот такое map<fun,MyClass>, где fun определен так: typedef int (*fun)(int);

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от Begemoth

Дался вам этот int, других типов что-ли нет? Вы не допускаете, что может быть код, которому нужно интерпретировать указатель/адрес как данные или часть данных? Код может быть не только для бизнес приложений. Ну анонимус-то понятно, он меня вписал в свой блокнот жертв и никаких аргументов воспринимать не будет(хотя и раньше не воспринимал).

Booster ★★
()
Ответ на: комментарий от www_linux_org_ru

А ты объясни, на койхер это надо делать? Язык наоборот должен такие фокусы жестко запрещать.

anonymous
()
Ответ на: комментарий от www_linux_org_ru

>map<fun,MyClass>, где fun определен так: typedef int (*fun)(int);

А зачем? operator< для указателей есть, а больше мапе и не надо ничего.

legolegs ★★★★★
()
Ответ на: комментарий от anonymous

> А ты объясни, на койхер это надо делать? Язык наоборот должен такие фокусы жестко запрещать.

Это не фокусы. Мне например надо аннотировать указатели на функции стрингами, вот я и юзаю map<int()(int),std::string>

да и проблем это не создает

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от legolegs

> А зачем? operator< для указателей есть, а больше мапе и не надо ничего.

эээ... разве?

но даже если и так, как определить operator< для указателей, не кастуя их в целые?

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от legolegs

Понятно, ну придётся извращаться


std::vector<std::function<void ()>> timer_callbacks;

void timer_proc(HWND, UINT, UINT_PTR nIDEvent, DWORD)
{
  if (nIDEvent < timer_callbacks.size())
    timer_callbacks[nIDEvent]();
}

void set_timer(UINT uElapse, const std::function<void ()>& callback)
{
  UINT_PTR nIDEvent = timer_callbacks.size();
  timer_callbacks.push_back(callback);
  SetTimer(NULL, nIDEvent, uElapse, timer_proc);
}

Либо через обработку аналогичным образом WM_TIMER.

Begemoth ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

но даже если и так, как определить operator< для указателей, не кастуя их в целые?

А разве оператор - для указателей не определён?

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

А разве оператор - для указателей не определён?

error: ISO C++ forbids using pointer to a function in subtraction

#include <iostream>

typedef int (*fun)(int);

int f(int i) { return i;    }
int g(int i) { return i*i;  }

int main()
{
    int i=f-g;
    std::cout << i;
    return 0;
}
www_linux_org_ru ★★★★★
()
Ответ на: комментарий от legolegs

> ^([^«']*(»([^'«]*(\\»))*[^«']*»)*[^«']*('([^'»]*")*[^'«]*')*)*[^»']*("([^'«]*(\\»))*[^«']*»)*[^«']*\w+_cast

ну dynamic_cast имеет таки право на жизнь; дырки в твоем write-only регекспе уже лень искать (хотя и можно)

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

А зачем минус?

int f1(int) { cout << "f1\n"; }
int f2(int) { cout << "f2\n"; } 
int main()
{
cout << ( f1 >f2 ) << endl; 
}

legolegs ★★★★★
()
Ответ на: комментарий от Booster

>Хамло.

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

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

> А зачем? operator< для указателей есть, а больше мапе и не надо ничего.

по ходу дискуссии речь шла о хэше, а я в свой пример воткнул map, хотя надо было бы hash_map

если бы не error: ISO C++ forbids using pointer to a function in subtraction, и был бы оператор-, то мапа, реализованная в виде дерева, могла бы быть устойчива даже к изменению указателей при сборке мусора (при условии, что GC не меняет их порядок)!

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

>по ходу дискуссии речь шла о хэше, а я в свой пример воткнул map, хотя надо было бы hash_map

#include <tr1/unordered_map>
using namespace std::tr1;
typedef int (*fun)(int);;
int f1(int) { cout << "f1\n"; }
int f2(int) { cout << "f2\n"; }
class MyClass {};
int main()
{
unordered_map<fun,MyClass> m;
m[f1] = MyClass();
m[f2] = MyClass();
}

Вроде работает. Но есть нюанс: ты сам указатель к инту не кастуешь, это за тебя делает отлаженная переносимая библиотека, так что криминала действительно нет. Я не смотрел, но наверняка там в хеш-функции учтены и особенности распределения указателей.

>даже к изменению указателей при сборке мусора

В смысле к дефрагментации свободного места? Да, наверно.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

> Но есть нюанс: ты сам указатель к инту не кастуешь, это за тебя делает отлаженная переносимая библиотека, так что криминала действительно нет.

Я так думаю, что «отлаженная переносимая библиотека» написана на с++, и ей вот требуется каст указателя к инту.

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

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

Ну вот поэтому я сформулировал свою мысль тут иначе, чем «запретить каст» :)

legolegs ★★★★★
()

> как определить operator< для указателей

www_linux_org_ru (17.02.2010 19:43:28)


А разве оператор - для указателей не определён?

Begemoth (17.02.2010 19:48:33)



О, сколько нам открытий чудных готовит книжка «Язык программирования С»!

И эти люди рассуждают о (не-)нужных фичах языка, да еще такого, как с++...

LamerOk ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

еще бы ты ссылок кинул на статьи по Capability calculus

Поищи презентаху François Pottier «Wandering through linear types, capabilities, and regions». У меня это что-то вроде чтения на ночь.

Miguel ★★★★★
()
Ответ на: комментарий от Booster

>> У тебя просили пример, когда нужно кастовать указатель к int и обратно.

Когда нужно кастовать я уже писал, колбеки, фух.


Ты написал чушь. Потому что если нужен колбек, то будет указатель на функцию.

** надевая фуражку **

Неявное приведение указателей к численным типам и обратно запрещено аж с С89. Явное может быть нужно для чёрной магии.

** снимая фуражку **

Как всегда, половина треда - срач между теми, кто не читал учебник, и теми, кто не понял, что первая половина его в руках не держала.

LamerOk ★★★★★
()
Ответ на: комментарий от lisprocks

DSL не нужны ни в каком виде, ни под каким соусом. Язык, который можно произвольным образом менять, это по определению write only язык.

Поэтому нужен достаточно мощный язык, в который DSL-и будут удобно встраиваться БЕЗ его перекорёживания.

В принципе, библиотека функций на C - это уже некоторым образом DSL. Другое дело, что так получаются только очень убогие DSL-и.

Miguel ★★★★★
()
Ответ на: комментарий от LamerOk

>Ты написал чушь. Потому что если нужен колбек, то будет указатель на функцию.
Опять двадцать пять. Библиотека требует колбека с юзер датой определённого типа, нужно передать и обработать другой тип. Никогда с таким не встречался?

Booster ★★
()
Ответ на: комментарий от LamerOk

Я нигде не писал, что это будет работать на всех платформах.

Booster ★★
()
Ответ на: комментарий от Booster

>Библиотека требует колбека с юзер датой определённого типа, нужно передать и обработать другой тип. Никогда с таким не встречался?

Все с таким сталкивались. И в борьбе с кривым by design апи все средства хороши, но самому такое непотребствоо придумывать нельзя.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

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

Booster ★★
()
Ответ на: комментарий от Booster

> Библиотека требует колбека с юзер датой определённого типа

Никогда с таким не встречался?


Я то с таким встречался, как и все, кто пытаются тебя образумить. А вот ты, видимо, нет.

Я нигде не писал, что это будет работать на всех платформах.


И на том спасибо. ))

LamerOk ★★★★★
()
Ответ на: комментарий от Booster

> Так о том и толкую

А полтреда про хэши кто заливал? Известный лётчик-ас Пушкин?

LamerOk ★★★★★
()
Ответ на: комментарий от Booster

>Так о том и толкую, что иногда приходится и в гумне ковыряться

Так чтож ты сразу не сказал, что речь о гумне. Столько букв бы сэкономили.

legolegs ★★★★★
()
Ответ на: комментарий от LamerOk

>> как определить operator< для указателей

www_linux_org_ru (17.02.2010 19:43:28)

А разве оператор - для указателей не определён?
Begemoth (17.02.2010 19:48:33)

О, сколько нам открытий чудных готовит книжка «Язык программирования С»!

И эти люди рассуждают о (не-)нужных фичах языка, да еще такого, как с++...

ну-ну — попробуй *определи* operator< для указателей без кастов к инту или *заюзай* оператор - для указателей на функции, а я посмотрю

З.Ы. в каких книжках пишут, что для указателей на функцию есть оператор < ?

www_linux_org_ru ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.