添加到 std::map 的 C++ 宏

标签 c++ macros

我是 C++ 的新手。我大约上周才开始接受它。

我正在尝试编写一个宏来访问 std::map 并将其添加到 std::map 中。但是,我发现这不起作用。我做错了什么或者有更好的方法来实现它吗?

#include <iostream>
#include <string>
#include <map>

typedef struct {
  std::string name;
  int value;
} Token;

std::map<std::string, Token> ALL_TOKENS;

#define T(macro, name, value) \
  Token macro {name, value}; \
  ADD(name, macro); \
  T(TEST, "Test", 1); \

#define ADD(str, tok) \
  ALL_TOKENS.insert(std::pair<std::string, Token>(str, tok)); \

#define GET(str) \
  ALL_TOKENS[str]; \

int main(int argc, const char * argv[]) {
  Token tok = GET("Test");
  printf("%s", tok.name.c_str());
  return 0;
}

最佳答案

在我看来,您的宏使代码更难理解。在我看来,您还没有完全理解 std::map

当我使用 map 时,我通常使用 operator[] 进行插入,也可能用于检索。如果您将其视为基本上可以使用任何(可排序)类型作为下标的数组,这通常是最简单的。

例如,要计算每个单词在文件中出现的频率,您可以这样做:

std::string word;
std::map<std::string, size_t> counts;

while (infile >> word)
    ++counts[word];

然后您可以打印出所有单词以及每个单词被找到的频率(按字母顺序),代码如下:

for (auto const &w : counts)
    std::cout << w.first << "\t" << w.second << "\n";

至少对我来说,这似乎比我使用您的宏编写的任何代码都更简单、更容易理解。

关于添加到 std::map 的 C++ 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26953021/

相关文章:

C++ 模板化类作为子类或引用?

c++ - 如何为 HTTP 代理服务器设置超时(不是连接超时)

c - 为什么宏函数不是按值调用?

macros - 宏与子程序

c - 为什么宏和同名函数只有在函数定义之后定义宏时才有效?

c++ - 处理面向行的数据时如何消除重复的代码模式?

C++在实现的纯虚拟方法中自动从父抽象类调用检查方法?

clojure - 使用包含类型提示的宏生成Clojure代码

c++ - 错误: aggregate has incomplete type and cannot be defined

c++ - 从可变宏参数创建成员