Я сделал версию console.log() на C++

Мне нравится JavaScript, console.log()
поскольку он может печатать переменные любого типа: числа, строки, массивы и объекты, а также полезен при отладке.
В последнее время я занимаюсь соревновательным программированием, но эта функция помогает мне отлаживать и там.
Но в C++ нет такой функции.
C++ быстр и подходит для конкурентного программирования, но каждый раз, когда вы хотите напечатать вектор для отладки, вам приходится писать длинный код, например for(int i = 0; i < N; ++i) std::cout << a[i] << std::endl;
. Соревновательное программирование — это гонка со временем, поэтому я хочу этого избежать.
Тогда почему бы не сделать свою версию на C++ console.log()
?
Итак, я сделал один (с большим усилием)!

Печать переменных с помощью cpp-dump
Чтобы использовать cpp-dump, включите его dump.hpp
в корневую папку репозитория и вызовите cpp_dump::dump()
.
Это так просто!
Примечание. Имя функции далеко от console.log()
. 😅
Код:
// In main() or some function
std::vector<std::vector<int>> my_vector{{3, 5, 8, 9, 7}, {9, 3, 2, 3, 8}};
cpp_dump::dump(my_vector);
Выход:

Функции
Примеры вывода распечатываются с использованием версии макроса.
Представление строк в стиле JavaScript
Как и console.log()
, cpp-dump печатает переменные в строковом представлении в стиле JavaScript.
Вывод итераций, таких как std::vector, std::array, массивы в стиле C:

Вывод std::map и std::unordered_map:

Вывод std::tuple и std::pair:

Однако на самом деле это похоже на Python, а не на JavaScript.
Вывод std::set и std::unordered_set:

Автоматический отступ
Если содержимое переменной велико, cpp-dump
автоматически делает отступ так, чтобы вывод соответствовал максимальной ширине строки.
Вывод итераций, таких как std::vector, std::array, массивы в стиле C:

Вывод std::tuple
, std::pair
, std::set
и std::unordered_set
также имеет такой же отступ.
Вывод std::map и std::unordered_map:

Он также может печатать вложенные контейнеры.
Поскольку cpp-dump
печатает переменную рекурсивно, он также может, например, печатать многомерные массивы и пары векторов.


Широкий спектр других поддерживаемых типов
cpp-dump
поддерживает различные другие типы, такие как std::multimap
, std::queue
, std::complex
и т. д. Подробности см. в README в репозитории.

Настраиваемые цвета вывода
Вы можете настроить цвета вывода cpp-dump
.
Следующее изображение является примером. Подробности
смотрите в README в репозитории.

Для использования в соревновательном программировании
CPP_DUMP()
длинный, поэтому давайте сократим его до dump()
макроса.
Кроме того, давайте напишем следующее, чтобы удалить его dump()
при отправке кода.
#include "./cpp-dump/dump.hpp"
#define dump(...) CPP_DUMP(__VA_ARGS__)
#else
#define dump(...)
#define CPP_DUMP_SET_OPTION(...)
#define CPP_DUMP_DEFINE_EXPORT_OBJECT(...)
#define CPP_DUMP_DEFINE_EXPORT_ENUM(...)
#endif
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
using namespace std;
int main() {
CPP_DUMP_SET_OPTION(max_line_width, 80);
int N;
cin >> N;
vector<int> X(N);
rep(i, N) { cin >> X[i]; }
dump(X);
}
Тогда при локальной компиляции исходного кода макрос dump()
будет работать только локально при выполнении следующей команды!
g++ main.cpp -D DEFINED_ONLY_IN_LOCAL
Заключение
Надеюсь, эта библиотека поможет!