О, куда там мне до того, чтобы быть вровень со стандартом!
Возможно, вы неправильно меня поняли, я не пытаюсь показать, что стою на одном уровне со стандартом языка. И, да, в C++ лучше называть объекты, которые можно вызывать, «функторами» или «функциональными объектами». Я назвал это «делегатами», чтобы вызвать ассоциации с делегатами из .NET, потому что хочу реализовать что-то подобное. Но стоит ли цепляться за терминологию?
К тому же, я не претендую на то, что эта разработка будет полезна где-нибудь в реальном коде (хотя, это не исключено). Однако, это ведь не повод не заниматься тем, что тебе интересно?
Это лишь часть реализации библиотеки делегатов. С помощью этих средств я решил проблему со связыванием аргументов из std::vector'а с функцией с произвольными параметрами и возвращаемым значением. Это лишь шаг на пути к разработке библиотеки делегатов.
Да, верно, параметры и возвращаемые значения, конечно, задаются статически во время компиляции. Но суть механизма, который я назвал «динамическим вызовом функций» — в том, чтобы получить объект делегата, а потом вызвать его, возможно, не зная ничего о параметрах и возвращаемом значении функции, на которую ссылается делегат. Там будет виртуальный метод, принимающий std::vector<std::any>, а с помощью Variadic_args_binder внутри метода будет происходить связывание аргументов и затем вызов функций. Таким образом я пытаюсь осуществить «стирание типов» («type erasure»), тогда делегаты станут нетипизированными, что непосредственно средствами языка в C++ сделать очень непросто.
Действительно, идентификаторы, начинающиеся с одинарного подчёркивания и следующей за ним заглавной буквы, зарезервированы стандартом C++ для реализации языка. Я тем самым пытаюсь показать пользователю, что использовать этот класс напрямую не стоит, так как это будет очень «грязно». Для этого есть класс-обёртка. А совпадение полного имени этого класса (с учётом пространств имён) едва ли возможно. Ведь библиотека будет выделена в отдельное пространство имён.
И да, мой любимый язык — действительно C++.
Возможно, вы неправильно меня поняли, я не пытаюсь показать, что стою на одном уровне со стандартом языка. И, да, в C++ лучше называть объекты, которые можно вызывать, «функторами» или «функциональными объектами». Я назвал это «делегатами», чтобы вызвать ассоциации с делегатами из .NET, потому что хочу реализовать что-то подобное. Но стоит ли цепляться за терминологию?
К тому же, я не претендую на то, что эта разработка будет полезна где-нибудь в реальном коде (хотя, это не исключено). Однако, это ведь не повод не заниматься тем, что тебе интересно?
Да, верно, параметры и возвращаемые значения, конечно, задаются статически во время компиляции. Но суть механизма, который я назвал «динамическим вызовом функций» — в том, чтобы получить объект делегата, а потом вызвать его, возможно, не зная ничего о параметрах и возвращаемом значении функции, на которую ссылается делегат. Там будет виртуальный метод, принимающий std::vector<std::any>, а с помощью Variadic_args_binder внутри метода будет происходить связывание аргументов и затем вызов функций. Таким образом я пытаюсь осуществить «стирание типов» («type erasure»), тогда делегаты станут нетипизированными, что непосредственно средствами языка в C++ сделать очень непросто.
Действительно, идентификаторы, начинающиеся с одинарного подчёркивания и следующей за ним заглавной буквы, зарезервированы стандартом C++ для реализации языка. Я тем самым пытаюсь показать пользователю, что использовать этот класс напрямую не стоит, так как это будет очень «грязно». Для этого есть класс-обёртка. А совпадение полного имени этого класса (с учётом пространств имён) едва ли возможно. Ведь библиотека будет выделена в отдельное пространство имён.
И да, мой любимый язык — действительно C++.