在支持多种类型的宏中使用printf

时间:2019-05-25 11:15:38

标签: c++

我有一个这样的宏:

#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?这不是那么简单,因为参数ab可以是任何类型(尽管现在只关心数字类型是可以的)。

也许是这样的:

#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"; }

...

0 个答案:

没有答案