名称空间探测



我正在尝试编写一个日志库,它将使用外部工具

为了使库更自然地使用,我希望能够检测到使用cout的命名空间。

具体来说,结果应该像这样使用

namespace A
{
    void foo()
    {
          cout << "Something went very wrong" << endl;
    }
}
namespace B
{
    void bar()
    {
          cout << "C should equal 3" << endl;
    }
}
int main()
{
    B::bar();
    A::foo();
}

,结果输出应该如下所示

MODULE::B : C should equal 3
MODULE::A : Something went very wrong

我已经使用std::streambuf将某些关键字添加到cout的输出,我所需要做的就是指定在哪个命名空间中使用哪个流buf。

我如何实现这一点?

我正在制作的库也将集成在一个具有多个名称空间的项目中,这使得大量使用using namespace声明。我需要一个不需要删除这些声明的解决方案。

edit1:我不在乎必须手工指定哪个名称空间与哪个字符串相关联或将对象添加到任何使用的名称空间(当然std除外)

如何创建您的自定义日志记录器流?这样,用户就可以指定失败的组件,如下所示:

namespace A {
    void foo()
    {
          log("A") << "Something went very wrong" << endl;
    }
}
namespace B {
    void bar()
    {
          log("B") << "C should equal 3" << endl;
    }
}
int main()
{
    B::bar();
    A::foo();
}

可能不太自动,但__FILE__宏也可以提供一些信息。

这在该语言中是不可能的。如果您正在使用Clang,您可以重新编译Clang来为您执行这样的任务。

您可以尝试在每个要显示的名称空间中注入像std::string namespace_name()这样的函数,然后调用std::cout << namespace_name()将导致大多数内部名称空间名称输出

最新更新