Я очень новичок в 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;
}
На мой взгляд, ваши макросы затрудняют понимание кода. Мне также кажется, что вы еще не совсем понимаете 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";
По крайней мере, для меня это кажется более простым и понятным, чем любой код, который я мог бы написать, используя ваши макросы.
Невзирая на плохой выбор использования макросов для доступа к функциональности...
Вы ничего не получаете, поскольку ничего не добавили к карте.
Пытаться
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;
}
Вы получите некоторый результат.