Добавление макроса C ++ в std :: map

0

Я очень новичок в C++. Я только начал поднимать это на прошлой неделе или около того.

Я пытаюсь написать макрос, чтобы иметь возможность доступа и добавления элементов на 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;
}
  • 2
    Есть ли способ лучше? Я не могу придумать худшего пути ...
  • 0
    @KerrekSB Хорошо ...? Я новичок в C ++. Я только поднял это на прошлой неделе.
Показать ещё 2 комментария
Теги:
macros

2 ответа

1
Лучший ответ

На мой взгляд, ваши макросы затрудняют понимание кода. Мне также кажется, что вы еще не совсем понимаете 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";

По крайней мере, для меня это кажется более простым и понятным, чем любой код, который я мог бы написать, используя ваши макросы.

  • 0
    Спасибо, ваш ответ помог больше всего.
0

Невзирая на плохой выбор использования макросов для доступа к функциональности...

Вы ничего не получаете, поскольку ничего не добавили к карте.

Пытаться

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

Вы получите некоторый результат.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню