Хорошо известно, что вы можете использовать макросы для создания версии printf
, которая может быть удалена из кода во время компиляции (скажем, если вы хотите печатать только на отладочных сборках). Полученный код можно использовать точно так же, как и использовать printf
.Можно ли «скомпилировать» потоковые выражения в C++?
Возможно ли создать аналогичный сценарий по отношению к потоку?
Например, предположим, что у меня есть следующий код:
#include <iostream>
class Foo
{
public:
template <typename T>
Foo& operator <<(const T& input)
{
std::cout << input;
}
};
int ComputeExpensiveThing(); // this function is expensive
void doSomething()
{
Foo() << "Expensive thing: " << ComputeExpensiveThing() << std::endl;
// do other things
}
Есть ли способ условно раздеть первую линию DoSomething() во время компиляции?
Я могу использовать макрос, чтобы получить подобный эффект, проверяя глобальное состояние во время выполнения:
#define FOO if(!someGlobalCondition); else Foo()
void doSomething()
{
FOO << "Expensive thing: " << ComputeExpensiveThing() << std::endl;
}
Однако это требует команда условного перехода каждый раз, когда мы используем FOO
. Это значительное улучшение по сравнению с вызовом ComputeExpensiveThing
, но я бы предпочел удалить лишние ветки.
Я также видел альтернативу, которая изменяет целевой синтаксис, что-то вроде
void doSomething()
{
Foo("Expensive thing: " << ComputeExpensiveThing() << std::endl);
}
но полученный синтаксис является немного странным и неинтуитивным для некоторых пользователей.
Возможно, было бы лучше разделить это на отдельные вопросы. – djs
@ djs: Здесь я вижу только один вопрос. Что еще (что нужно отделить)? – Cornstalks
Второй смелый вопрос должен быть конкретным примером, разъясняющим смысл первого. Извините, если это сбивает с толку! – bobobo