Se si dispone di C++ 11 si può fare qualcosa typesafe e abbastanza ordinata con i modelli variadic, ad esempio:
#include <string>
#include <iostream>
template <typename T>
void debug(const T& v) {
std::cout << v << "\n";
}
template <typename T, typename... Tail>
void debug(const T& v, const Tail& ...args) {
std::cout << v << " ";
debug(args...);
}
#define NVP(x) #x":", (x)
int main() {
int foo=0;
double bar=0.1;
std::string f="str";
debug(NVP(foo),NVP(bar),NVP(f));
}
La macro NVP qui è del tutto facoltativo e solo necessaria se si desidera stampare il nome a cui si riferisce anche nel codice.
Se davvero si vuole ignorare il bit NVP è possibile utilizzare la libreria Boost pre-processore (o rotolare il proprio) ad es .:
#include <string>
#include <iostream>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>
template <typename T>
void debug_impl(const T& v) {
std::cout << v << "\n";
}
template <typename T, typename... Tail>
void debug_impl(const T& v, const Tail& ...args) {
std::cout << v << " ";
debug_impl(args...);
}
#define NVP(x) #x":", (x)
#define MEMBER(r, data, i, elem) BOOST_PP_COMMA_IF(i) NVP(elem)
#define debug(members) \
debug_impl( \
BOOST_PP_SEQ_FOR_EACH_I(MEMBER,, members) \
)
int main() {
int foo=0;
double bar=0.1;
std::string f="str";
debug((foo)(bar)(f));
}
per il prezzo di una sintassi un po 'strana. Il mio esempio è basato su this answer. Ho provato ad usare macro variadic per risolvere questo problema direttamente come una soluzione "pura" in C++ 11, ma risulta che ricorrere in una lista è più complicato di quanto sperimenti con esso.
Usa buona vecchia stampa. – kol
@kol printf non stringe i parametri, come il '' macro '# –