Я работаю над кодовой базой, в которой есть макрос, который ведет себя примерно так:
struct to_void {
template<class T>
inline void operator&&(T&& t) {}
};
#define cout_if(c) (!(c)) ? ((void)0) : to_void() && std::cout
// --
extern int expensive_op(int c);
void foo(int a, int b) {
cout_if(a < b) << expensive_op(a + b);
}
Можно ли создать шаблон, который сохраняет синтаксис cout_if
, а также предотвращает оценку a + b
и expensive_op
, если они не нужны? Я вижу, что подобные вещи полезны в других контекстах (например, во встроенных DSL), но макрос кажется хрупким.