Re[47]: offsetof() без UB
От: kov_serg Россия  
Дата: 01.04.25 08:37
Оценка:
Здравствуйте, rg45, Вы писали:

R>Хотя, казалось бы, чего уж проще:

R>https://godbolt.org/z/1aEEdoE96

R>
R>#include <stdio.h>

R>template <auto member>
R>requires (member != nullptr)
R>struct Accessor
R>{
R>   constexpr decltype(auto) operator()(auto&& object) const {
R>      return object.*member;
R>   }
R>   constexpr decltype(auto) operator()(auto&& object, auto&&...args) const {
R>      return (object.*member)(args...);
R>   }
R>};
R>template <auto member> constexpr Accessor<member> accessor;

R>struct A {
R>   int x = 10;
R>   virtual int fn(int y) { return x + y; }
R>};

R>int main() {
R>   A a[1];
R>   auto fn = accessor<&A::fn>;
R>   auto x = accessor<&A::x>;

R>   printf("x=%d fn(20)=%d\n", x(*a), fn(*a, 20));
R>}
R>

Это конечно здорово, но это просто обёртка. Она не решает вопроса как такое передавать во внешнюю среду, или принимать из неё подобное.
struct A {
    int x=10;
    virtual int fn(int y) { return x+y; }
    
    static int* ptr_to_x(A* a) { return &a->x; }
    static int (ptr_to_fn)(A* a,int y) { return a->fn(y); }
};

#include <stdio.h>
int main(int argc, char **argv) {
    A a[1];
    int (*pfn)(A*,int)=A::ptr_to_fn;
    int* (*px)(A*)=A::ptr_to_x;
    printf("px=%p pfn=%p\n",px,pfn);
    printf("x=%d fn(20)=%d\n",*px(a),pfn(a,20));
    return 0;
}

Более того предыдущие указатели можно было сгенерировать руками если нет поддержки c++17. А тут только C++20.

ps: А что будет если надо обернуть функцию без параметров void A::g(); ?
Отредактировано 01.04.2025 9:01 kov_serg . Предыдущая версия .
Re[48]: offsetof() без UB
От: rg45 СССР  
Дата: 01.04.25 08:59
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Это конечно здорово, но это просто обёртка. Она не решает вопроса как такое передавать во внешнюю среду, или принимать из неё подобное.

_>Более того предыдущие указатели можно было сгенерировать руками если нет поддержки c++17. А тут только C++20.

Объект accessor<...> прекрасно заточен под передачу в качестве параметра. Если же ты имеешь в виду внешнюю среду, которая сама по себе сделана через жопу, тогда конечно, вокруг этого нужно будет сделать черезжопные обертки. Какие именно обёртки — будет продиктовано спецификой чережопной внешней среды.

_>ps: А что будет если надо обернуть функцию без параметров void A::g(); ?


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

Более полный вариант мог бы выглядеть примерно так:

https://godbolt.org/z/3MEKsr4e3

#include <stdio.h>
#include <utility>

template <auto member>
requires (member != nullptr)
struct Accessor
{
   template <typename T>
   constexpr decltype(auto) operator()(T&& object) const
   requires (
      requires {std::forward<T>(object).*member;}
      and not requires {(std::forward<T>(object).*member)();})
   {
      return std::forward<T>(object).*member;
   }
   template <typename T, typename...X>
   constexpr decltype(auto) operator()(T&& object, X&&...x) const
   requires requires {(std::forward<T>(object).*member)(std::forward<X>(x)...);}
   {
      return (std::forward<T>(object).*member)(std::forward<X>(x)...);
   }
};
template <auto member> constexpr Accessor<member> accessor;

struct A {
   int x = 10;
   virtual int fn(int y) { return x + y; }
   int get() const {return x;}
};

int main() {
   A a[1];
   auto fn = accessor<&A::fn>;
   auto x = accessor<&A::x>;
   auto get = accessor<&A::get>;

   printf("x=%d fn(20)=%d get=%d\n", x(*a), fn(*a, 20), get(*a));
}


При необходимости, разумеется, можно сделать и раздельные аксессоры для членов-функций и для членов-данных, это уже зависит от конкретных требований
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 01.04.2025 9:03 rg45 . Предыдущая версия .
Re[49]: offsetof() без UB
От: kov_serg Россия  
Дата: 01.04.25 09:05
Оценка:
Здравствуйте, rg45, Вы писали:


R>Более полный вариант мог бы выглядеть примерно так:

R>https://godbolt.org/z/3MEKsr4e3

Вы же сами должны понимать что такая обёртка не решает никаких проблем. Так что такой фантик бесполезен. В этом и есть сила c++ он способен элегантным способом сложные задачи, которые бы не возникли если бы не c++.
Повторю предыдущий вариант может работать вообще без шаблонов на любом c++, просто более длинно.
Отредактировано 01.04.2025 9:13 kov_serg . Предыдущая версия .
Re[50]: offsetof() без UB
От: rg45 СССР  
Дата: 01.04.25 09:11
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Вы же сами должны понимать что такая обёртка не решает никаких проблем.


Если опираться на твой пример
Автор: kov_serg
Дата: 31.03 13:35
, то все "проблемы" решаются на 100%. Только без указателей, которые и в хер никому не упёрлись. А никаких других проблем ты не озвучивал Поведай, что за проблемы решает твой супер-бульбулятор. Если это какой-нибудь интероперабилити с "прятными языками", то ты явно не умеешь отделять мух от котлет.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 01.04.2025 9:14 rg45 . Предыдущая версия .
Re[51]: offsetof() без UB
От: kov_serg Россия  
Дата: 01.04.25 09:20
Оценка:
Здравствуйте, rg45, Вы писали:

R>Если опираться на твой пример
Автор: kov_serg
Дата: 31.03 13:35
, то все "проблемы" решаются на 100%.

R>Только без указателей, которые и в хер никому не упёрлись. А никаких других проблем ты не озвучивал
Ваша необоснованная предвзятость на счет указателй довольно странная. Это просто адрес, без c++ заморочек.

R>Поведай, что за проблемы решает твой супер-бульбулятор.

Любую проблему можно решить введением дополнительного уровня абстракции кроме одной — слишком большого количества уровней абстракции.

Этот приём позволяет избавиться от лишних абстракций

R>Если это какой-нибудь интероперабилити с "прятными языками", то ты явно ошибся форумом.

И да так же её можно экспортировоть во вне и импортировать снаружи через C апи Например делать foreach и внешние модели отслеживающие изменения.
Re[52]: offsetof() без UB
От: rg45 СССР  
Дата: 01.04.25 09:24
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Ваша необоснованная предвзятость на счет указателй довольно странная. Это просто адрес, без c++ заморочек.


Это не просто адрес — это пачка необоснованного геморроя и бессмысленной пессимизации. Но тебе это объяснять бесполезно, это я уже понял.

_>Этот приём позволяет избавиться от лишних абстракций


Понятно, указатели — это самоцель. Попутного Вам ветра.

Более не вижу смысла тратить на тебя время.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 01.04.2025 9:25 rg45 . Предыдущая версия .
Re[53]: offsetof() без UB
От: kov_serg Россия  
Дата: 01.04.25 09:31
Оценка:
Здравствуйте, rg45, Вы писали:

R>Это не просто адрес — это пачка необоснованного геморроя и бессмысленной пессимизации. Но тебе это объяснять бесполезно, это я уже понял.

Вообще вы странный. Ситуация в точности наоборот.

R>Понятно, указатели — это самоцель. Попутного Вам ветра.

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

R>Более не вижу смысла тратить на тебя время.

Ясно аргументы кончились.
Re[54]: offsetof() без UB
От: rg45 СССР  
Дата: 01.04.25 09:34
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Нет цель сделать максимально просто, без лишних усложнений.


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

_>Ясно аргументы кончились.


Так на аргументы ты кривляешься и ёрничаешь. Как вот здесь
Автор: kov_serg
Дата: 01.04 12:20
. Это же ты не можешь ответить на простые вопросы. Устраиваешь клоунаду вместо этого. Короче, с тобой всё ясно.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 01.04.2025 9:46 rg45 . Предыдущая версия . Еще …
Отредактировано 01.04.2025 9:43 rg45 . Предыдущая версия .
Отредактировано 01.04.2025 9:42 rg45 . Предыдущая версия .
Отредактировано 01.04.2025 9:38 rg45 . Предыдущая версия .
Отредактировано 01.04.2025 9:35 rg45 . Предыдущая версия .
Re[55]: offsetof() без UB
От: kov_serg Россия  
Дата: 01.04.25 09:56
Оценка:
Здравствуйте, rg45, Вы писали:

_>>Нет цель сделать максимально просто, без лишних усложнений.

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

R>>>Более не вижу смысла тратить на тебя время.

_>>Ясно аргументы кончились.
R> Короче, с тобой всё ясно.
https://cs15.pikabu.ru/video/2025/01/10/1736474512218598227_5f1de627_1280x706.webm
Re[56]: offsetof() без UB
От: rg45 СССР  
Дата: 01.04.25 10:04
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Добавлять проверки никто не запрещает если это необходимо.


Что значет "если"? Если ты делаешь формальный параметр указателем, у тебя нет другого выхода.

_>https://cs15.pikabu.ru/video/2025/01/10/1736474512218598227_5f1de627_1280x706.webm


Тебя воспитательница искала.
--
Справедливость выше закона. А человечность выше справедливости.
Re[57]: offsetof() без UB
От: kov_serg Россия  
Дата: 01.04.25 10:23
Оценка:
Здравствуйте, rg45, Вы писали:

R>Что значет "если"? Если ты делаешь формальный параметр указателем, у тебя нет другого выхода.

Есть. Я могу делать проверки только в DEBUG например. И вообще это объявляется на уровне контрактов, концептов и другой информации уровня компилятора или еще раньше
Re[58]: offsetof() без UB
От: rg45 СССР  
Дата: 01.04.25 10:36
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Есть. Я могу делать проверки только в DEBUG например. И вообще это объявляется на уровне контрактов, концептов и другой информации уровня компилятора или еще раньше


Говнокодить, короче. На какие только жертвы не пойдешь ради указателей.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 01.04.2025 10:38 rg45 . Предыдущая версия .
Re[59]: offsetof() без UB
От: kov_serg Россия  
Дата: 01.04.25 10:46
Оценка:
Здравствуйте, rg45, Вы писали:

R>Говнокодить, короче. На какие только жертвы не пойдешь ради указателей.

Да и говнокодить тоже, как же без этого
Re[42]: offsetof() без UB
От: B0FEE664  
Дата: 01.04.25 16:38
Оценка:
Здравствуйте, kov_serg, Вы писали:

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

_>Вы вообще когда-нибудь пользовались указателями на функцию?
да
_>А анонимными функциями?
да
_>А замыканиями?
да
_>Вы считаете это сложным?
Любой код можно запутать так, что он станет сложным для чтения. Как правило, если используют указатели на функции, то код становится запутанным и поэтому сложным для чтения.

BFE>>Что сделать ревью кода с указателями на функции нужно раза в два больше времени, чем без них.

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

_>Яркий пример java.

Не использую ни в программировании, ни в виде приложений.

_>Да вы за??али ссылка и указатель это одно и тоже. И принципиально ничем не отличается, кроме особенностей которые введены искуственно.

Вот поэтому я и говорю: указатель на функцию — это и есть абстрактная абстракция.

BFE>>Указатель на функцию сам по себе дополнительное понятие, концепция и сущность.

_>Это не должно быть дополнительной концепцией и сущностью, это должно быть first class citizen и лучше если оно выражено через уже имеющиеся концепции не вводя новых.
Вот если так сделать, то будет по настоящему сложно, как в JavaScript, где функция может создавать функцию, создающую функцию, причем все они будут генерироваться и изменятся в зависимости от вызова и параметров. Читали когда нибудь такое? Исправляли?

_>Это минус только для теоретика. Инженерам не нужен изолированный язык. Нуже тот что позваляет решать практические задачи.

Я практик и чем лучше изоляция, тем мне проще.

_>>>И не вводит никаких ограничений,

BFE>>Это минус.
_>Наручники это тоже плюс, но не для того на ком они.
То есть вам не нравится проверка соответствия типов при компиляции? JavaScript ваш любимый язык?

BFE>>Указатель на функцию — это просто и понятно?

BFE>>Тогда может вы расскажите, как правильно перегрузить operator << для своего потока и std::endl ?
_>Элементар но же. Не используйте std::endl есть милион и маленькая тележка сделать иначе, а не это убожество с потоками.


_>>>И да WinAPI это C-шный апи.

BFE>>C-шный апи — это чисто зло. Вот прямо сегодня половину дня (из-за C-шного апи) я искал ошибку в чужом коде.
_>Зло. Хорошо. Сделайте лучше. Или хотя кривую альтернативу.
Так уже.

_>>>Т.к. c++ не способен предоставть вообще никакого вменяемого бинарного апи которое смогут использовать другие даже c++шки

BFE>>И это правильно.
_>Аргументация прям огонь.
Что вы знаете про dll hell?
И каждый день — без права на ошибку...
Re[43]: offsetof() без UB
От: kov_serg Россия  
Дата: 01.04.25 20:42
Оценка: :)
Здравствуйте, B0FEE664, Вы писали:

BFE>Я практик и чем лучше изоляция, тем мне проще.

В C++ с этих хреново.

_>Сделайте лучше. Или хотя кривую альтернативу.

BFE>Так уже.
Где?

_>>Аргументация прям огонь.

BFE>Что вы знаете про dll hell?
Это вообще позор какой-то в 2025 году есть куча базданных.
Вот что мешает систематизировать информацию о библиотеках?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.