使用文字作为constexpr变量时的函数(或调用)重载

时间:2017-01-17 23:22:57

标签: c++

嗨(抱歉标题 - 我无法让它更有意义),

我在这里使用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

0 个答案:

没有答案