我有一个这样的宏:
#define assert_cmp(a, cmp, b) \
if(!((a) cmp (b))) { \
std::cerr << "Assertion failed: " << a << " " << #cmp << " " << b << std::endl; \
assert((a) cmp (b)); \
}
(是的,我也许应该对此做一个do { ... } while(0)
...)
然后我可以使用它作为示例,例如:
void f(int a) {
assert_cmp(a, <=, 42);
// ...
}
那很好。但是现在,我想对某些CUDA代码也使用相同的宏,并且我只能在其中使用printf
。 (CUDA与该问题并没有真正的关系,只是我必须使用printf
。)
如何转换宏以使用printf
而不是std::cerr
?这不是那么简单,因为参数a
和b
可以是任何类型(尽管现在只关心数字类型是可以的)。
也许是这样的:
#define assert_cmp(a, cmp, b) \
if(!((a) cmp (b))) { \
printf("Assertion failed: "); \
printf(_format_for_type(a), a); \
printf(" " #cmp " "); \
printf(_format_for_type(b), b); \
printf("\n"); \
assert((a) cmp (b)); \
}
template<typename T>
const char* _format_for_type(const T&);
template<> const char* _format_for_type(const int&) { return "%i"; }
template<> const char* _format_for_type(const float&) { return "%f"; }
...