생략 부호가있는 함수를 사용하는 것은 그리 안전하지 않습니다. 로그 기능에 성능이 중요하지 않은 경우 boost :: format에서와 같이 연산자 오버로딩을 사용하는 것이 좋습니다. 다음과 같이 작성할 수 있습니다.
#include <sstream>
#include <boost/format.hpp>
#include <iostream>
using namespace std;
class formatted_log_t {
public:
formatted_log_t(const char* msg ) : fmt(msg) {}
~formatted_log_t() { cout << fmt << endl; }
template <typename T>
formatted_log_t& operator %(T value) {
fmt % value;
return *this;
}
protected:
boost::format fmt;
};
formatted_log_t log(const char* msg) { return formatted_log_t( msg ); }
int main ()
{
log("hello %s in %d-th time") % "world" % 10000000;
return 0;
}
다음 샘플은 줄임표가있는 가능한 오류를 보여줍니다.
int x = SOME_VALUE;
double y = SOME_MORE_VALUE;
printf( "some var = %f, other one %f", y, x ); // no errors at compile time, but error at runtime. compiler do not know types you wanted
log( "some var = %f, other one %f" ) % y % x; // no errors. %f only for compatibility. you could write %1% instead.