Для C ++ я использую это:
#define STR(x) #x << '=' << x
int main()
{
int i = 1;
std::string str("hello");
std::vector<std::string> vec;
my_class mc;
...
std::cout << STR(i) << std::endl
<< STR(str) << std::endl
<< STR(vec) << std::endl
<< STR(mc) << std::endl;
return 0;
}
Таким образом, компилятор выбирает потоковый оператор на основе типа данных, поэтому вам не нужно беспокоиться о разных макросах для каждого, и он может пойтик любому std :: ostream, а не просто к std :: cout.Просто предоставьте соответствующий оператор потоковой передачи для ваших данных:
std::ostream operator<<(std::ostream&, const T&);
std::ostream operator<<(std::ostream&, const std::vector<T>&);
etc
Но мне бы хотелось, чтобы существовал шаблонный способ замены макроса или хотя бы имя переменной, предоставленное # x.