如何缩短C ++中的方法调用?

时间:2017-08-14 13:51:10

标签: c++ c++14

我有一个日志记录类(单例),每次调用都是这样的:

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);

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);
}

它会破坏你想要的代码,但对我来说看起来很好,而且没有宏。