【问题标题】:C++ @ custom annotation as Java or PythonC++ @ 自定义注解为 Java 或 Python
【发布时间】:2022-01-24 17:57:11
【问题描述】:

是否可以在 C++ 中创建像 @ 这样的自定义注解或像 Rust 的 [#...] 这样的其他字符?

目标类似于:

#pragma once

#include "my_header.h"

@RestController(path = "/home")
void MyClass::some_method(int int_arg)
{
    // some C++ code
}

我已经在阅读与此类似的旧问题,但从现在起应该是 7 岁或更多。

现在有办法实现这一点吗?

问候

【问题讨论】:

  • en.cppreference.com/w/cpp/language/attributes。不过,这取决于您要从中寻找什么。
  • 不@chris,不可能创建自定义的,这是主题的重点```编译器会忽略它无法识别的任何属性,这意味着您无法定义您的使用此语法的自定义属性 ``` docs.microsoft.com/en-us/cpp/cpp/attributes?view=msvc-170
  • 编译器会忽略它们,但工具可以免费使用它们。该语言(当前)没有为您提供一种以编程方式与属性交互的方法,因此编译器是否忽略它们是无关紧要的。这就是为什么它取决于,例如,预编译步骤是否足够好,或者您是否专门寻找可以生成代码或执行其他任务的东西作为编译本身的一部分。
  • 你是绝对正确的@chris 我正在尝试设计一个 Spring 风格的 Web 框架(仅用于学习目的)。将注释的内容提供给另一个内部类的想法是。我已经看到了另一个采用这种风格的精彩 C++ 项目,但我想将其规划为一个 DI 容器,您可以在其中“注册”您的类并使其对最终用户可用,并提供多个 API。您能否进一步解释是否可以选择检索路径的 [[my::RestController(path = "/home")]] 属性的值?还是在 C++20 中也没有办法?
  • 我认为宏是更直接翻译此类内容的最常见解决方案。我建议研究一下现有的各种 DI、服务器端 REST 等库,以了解人们采取的所有路径。

标签: java c++ rest annotations web-frameworks


【解决方案1】:

是和否。

作为一般概念,没有什么相似之处。我敢冒险,它需要运行时类型信息,这会增加许多用例的二进制大小并且太容易破解,除非你对语言非常小心。

正在开发中的东西(编译时反射)将非常强大(所有好处,在运行时没有任何缺点)。 AFAIK,在撰写本文时,它仍然是一个提案,我找不到任何有关进展的信息。

最后,我想指出,如果你尝试用 C++ 编写 Java 或 Rust,你会遇到麻烦。 C++ 中有针对大多数问题的解决方案,但看起来可能略有不同,并且具有不同的特性(性能、缺点等)。

我不明白为什么你不能定义一个静态注册函数来为你提供相同的功能。您已经可以在宏和模板之间做很多事情,但我建议您提出一个更集中的问题。

【讨论】:

  • 因为它是语言的一个很好的补充,例如,以现代方法构建 Web API。但是你能用模板机制详细说明类似的东西吗?我的意思是,这是我从注释中得出的第一个想法,但我只是想知道这会是一个不错的补充。
  • @Pyzyryab 如果你想要自我注册部分,我自己还没有实现,但我已经看到他们在测试库中大量使用。这是一个:blog.rubenwardy.com/2019/02/17/cpp-self-registering-test-macros。对于命名参数(我猜你希望它们映射到 URL 参数),我见过这样的东西:brevzin.github.io/c++/2019/12/02/named-arguments 但可能需要更多的工作才能使其与其余代码更好地集成。
  • @Pyzyryab 可能更容易让该函数采用您已经可以序列化和/或反映的类(如 developers.google.com/protocol-buffers/docs/cpptutorial )然后到/从 URL 的映射应该更简单。
  • 我真的很喜欢@Sorin 的第二种方法,但正如您所提到的,我发现很难考虑如何将它与代码集成。在那里编写的属性必须可以用于某种 DI 容器......这仍然是一个非常早期的想法(既不是项目),但我想会有一些类作为 Spring 的 Rest Template 可以将所有这些属性映射到一种路由器
猜你喜欢
  • 2014-01-13
  • 1970-01-01
  • 2011-06-12
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 2013-09-28
相关资源
最近更新 更多