Ghost2
> сказочно одаренный фантазёр.
Это какраз я.
Ghost2
> И ещё - я бы посмотрел, как бы это сделал на юнионах лично ты, лол
union conv{ size_t v; void* p; }; { int v=42; conv.p=&v; cout<<conf.v; }
samrrr
В целом неплохо, но это в другую сторону и там было Foo* и intValue.
0iStalker
> А можно изначально был сделать так, чтобы не наступать на такие детские грабли?
Можно. Программируй на C++, в нём подобное скомпилить гораздо труднее.
Ghost2
> В целом неплохо, но это в другую сторону и там было Foo* и intValue.
указатель в инт может и не влезть. И в обратную сторону тоже самое будет.
{ int v=42; conv conv1; conv1.p=&v; cout<<conv1.v; conv conv2; conv conv2.v=conv1.v; cout<<*conv2.p; }
samrrr
> указатель в инт может и не влезть
В intptr_t должен влезть.
> И в обратную сторону тоже самое будет.
Дело не в этом, а конкретно в Foo. Ведь дальше у тебя два варианта:
1. Под каждое такое приведение иметь собственный union1
2. Из void* в Foo* тебе нужно будет кастовать при помощи reinterpret
И все это ради того-же нарушения strict aliasing (читай UB).
Давайте уж тогда memcpy/memmove использовать. Ведь компилятор умный, он поймёт, что функцию вызывать не нужно. Плохо только тем, что с литералами работать не будет.
1 Ещё можно разбавить вариантом 1.1, когда conv это шаблон. Специально для тех, кому во втором триместре, вместо классической музыки, мама ставила Александреску «Избранное».
0iStalker
> счастливой отладки
Foo* p = new Foo; Foo* q = p; delete p;
И вам не унывать.
> Foo* foo = reinterpret_cast<Foo*>(intValue);
> Других способов привести число к указателю в С++ нет (ну, кроме C-style каста).
> юнионы
Эээ, memcpy(&foo,&intValue,sizeof(foo)), std::bit_cast<Foo*>(intValue)?
Напомню про uintptr_t, и что type-punning с помощью unions - UB в C++.
Имбирная Ведьмочка
> И вам не унывать.
Ты нарушил несколько правил CORE GUIDELINES.
-Не юзать new просто так.
-Не юзать delete просто так.
-Не использовать owning-raw.
Если ты это делаешь, это как unsafe прописать в каком-нибуть C#. Всё на свой страх и риск.
FordPerfect
> и что type-punning с помощью unions - UB в C++.
У меня работало и ещё ни разу не баговало.
Шо, windows.h можно отправлять в топку? Работать уже перестал?
GCC со своим алиазом пусть идёт лесом, что по MSVC?
Ghost2
> 1. Под каждое такое приведение иметь собственный union1
> 2. Из void* в Foo* тебе нужно будет кастовать при помощи reinterpret
Я обмажу это дело темплейтами, модулями и концептами и не надо будет ни 1 ни 2.
> strict aliasing
Законтрю эту муть:
-fno-strict-aliasing
> Давайте уж тогда memcpy/memmove использовать. Ведь компилятор умный, он поймёт,
> что функцию вызывать не нужно. Плохо только тем, что с литералами работать не
> будет.
Не, надо memcpy_s юзать. Он получше чем дефолтный сишный.
0iStalker
> class SomeClass(object):
> foo = 0;
> def method1(self, x):
> self.fu = 1;
map<string, int> some_map = {{"foo", 0}}; void method1(const map<string, int>& self) { self["fu"] = 1; // счастливой отладки }
upd: капец ещё и текста в 3 раза больше набивать с руки чтобы то же самое получить
Nomad
> void method1(const map<string, int>& self) {
> self["fu"] = 1; // счастливой отладки
> }
Садись, двойка.
В С++ это было бы вот так
private: int foo=0; public: void foo(int x) { fu = 1; // кодер, ты дурак еггог ин зис лайн }
>вы нипанимаете ета другое!(
> В С++ это было бы вот так
нет, в с++ это именно что std::map<string, shared_ptr<PyObject>>
Nomad
> > ы нипанимаете ета другое!(
Это то самое! В С++/C#/Java... даже в бейсике - нельзя скомпилировать программу с банальной опечаткой/синтаксической ошибкой, в пайтоне можно... страдай.
0iStalker
> в пайтоне можно...
> скомпилировать программу
Тема в архиве.