Sử dụng các hàm với dấu chấm lửng không an toàn lắm. Nếu hiệu suất không quan trọng đối với hàm nhật ký, hãy xem xét sử dụng nạp chồng toán tử như ở định dạng boost ::. Bạn có thể viết một cái gì đó như thế này:
#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;
}
Mẫu sau minh họa các lỗi có thể xảy ra với dấu ba chấm:
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.