嗨(抱歉标题 - 我无法让它更有意义),
我在这里使用constexpr加密字符串文字:Compile time string encryption using constexpr
我用它来隐藏二进制文件中日志中使用的字符串文字(格式)。它工作得很好,宏看起来如下:
app.use('/mysuperapi/*', function(req, res, next) {
// do your filtering here, call a `res` method if you want to stop progress or call `next` to proceed
var ip = req.ip ||
req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress;
// Your allowed ip. You can also check against an array
if (ip == '5.4.3.2') {
next();
} else {
res.end();
}
}
app.use('/mysuperapi', require('./routes/api'));
// ... the rest of your code
问题是WriteLog还有一个重载版本:
#define LOG(format, ...) do { \
constexpr auto secformat = LIT((format)); \
WriteLog(static_cast<std::string>(secformat).c_str(), ##__VA_ARGS__); \
} while(0)
void WriteLog(char const * format, ...);
之前,LOG宏看起来如下:
void WriteLog(int param1, int param2, char const * format, ...);
因此编译器很容易选择正确的重载,这样就可以进行如下调用:
#define LOG WriteLog
现在我只能处理第一个日志案例,但是当找到像* 2这样的日志时它就无法工作。
所以问题是我是否可以使用某种方法来继续使用上述* 1和* 2之类的日志?
我试图使用constexpr函数,尝试使用可变参数模板 - 但在这两种情况下我都以一些非constexpr参数结束。但是我对这两种语言功能都不是很强。
下面的是源代码(LIVE on coliru):
LOG("Some log text %d %d", 1, 2); // *1
LOG(SEVERITY_HIGH, DEST_CLIENT, "Some log text %d %d", 1, 2); // *2