1

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

为了使库更自然地使用,我希望能够检测使用 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 的输出添加某些关键字,我需要做的就是指定在哪个命名空间中使用哪个 streambuf。

我如何实现这一目标?

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

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

4

3 回答 3

2

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

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__宏也可以提供一些信息。

于 2013-04-09T12:46:10.470 回答
1

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

于 2013-04-09T12:43:39.730 回答
1

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

于 2013-04-09T12:45:51.580 回答