我有一个日志记录类(单例),每次调用都是这样的:
SomeNamespace::Logger::instance().log(SomeNamespace::Logger::Priority::Error, "log info %d %d %d", 1, 2, 3);
是否可以在C ++ 14中缩短此调用?
如果有更优雅的方法,我不想使用#define,但我自己无法弄明白。
编辑:我真正想要的是为不同的日志记录级别创建一组函数别名,以使调用看起来像:LogInfo("log info %d %d %d", 1, 2, 3);
LogError("log info %d %d %d", 1, 2, 3);
答案 0 :(得分:1)
像这样导入名称空间
using SomeNamespace
或者
using SomeNamespace::Logger
编辑:
最容易实现的目标如下:
LogInfo("log info %d %d %d", 1, 2, 3);
LogError("log info %d %d %d", 1, 2, 3);
是为Logger类创建一个外观,它为您完成所有脏工作并使用使用指令导入它。
答案 1 :(得分:0)
对于刚刚投入创意的工作表示抱歉:)
从这里C++11: How to alias a function?你可以使用完美转发声明一个函数别名吗?
template <typename... Args>
auto g(Args&&... args) -> decltype(f(std::forward<Args>(args)...)) {
return f(std::forward<Args>(args)...);
}
或
#include <iostream>
namespace Bar
{
void test()
{
std::cout << "Test\n";
}
template<typename T>
void test2(T const& a)
{
std::cout << "Test: " << a << std::endl;
}
}
void (&alias)() = Bar::test;
void (&a2)(int const&) = Bar::test2<int>;
int main()
{
Bar::test();
alias();
a2(3);
}
答案 2 :(得分:0)
如果你想实现
LogInfo("log info %d %d %d", 1, 2, 3);
LogError("log info %d %d %d", 1, 2, 3);
然后您可能只想在原始Logger周围编写一些包装函数。像这样:
void LogInfo(const char* fmt...) {
SomeNamespace::Logger::instance().log(SomeNamespace::Logger::Priority::Info, fmt);
}
void LogError(const char* fmt...) {
SomeNamespace::Logger::instance().log(SomeNamespace::Logger::Priority::Error, fmt);
}
但是如果你想减少代码重复并根据你的Priority
内容自动生成所有这些函数,那么除了宏之外我没有看到任何方法,因为C ++中没有机制来生成不同的函数声明名。对不起,但我只能建议这个解决方案:
#define DeclareLogFunction(LEVEL) \
void Log##LEVEL(const char* fmt...) { \
SomeNamespace::Logger::instance().log(SomeNamespace::Logger::Priority::LEVEL, fmt); \
}
DeclareLogFunction(Debug)
DeclareLogFunction(Info)
DeclareLogFunction(Error)
DeclareLogFunction(Critical)
int main(){
LogError("log info %d %d %d", 1, 2, 3);
}
此外,您可能对此方法感兴趣:
template <SomeNamespace::Logger::Priority P>
void Log(const char* fmt...) {
SomeNamespace::Logger::instance().log(P, fmt);
}
int main() {
Log<SomeNamespace::Logger::Priority::Info>("log info %d %d %d", 1, 2, 3);
}
它会破坏你想要的代码,但对我来说看起来很好,而且没有宏。