在命名空间中等效#define

时间:2015-05-07 08:46:38

标签: c++ macros namespaces

我想基于std :: exception创建一个异常类,它允许我使用内置宏(至少Visual Studio包含它们)来提供文件,函数和行号。

因为编写这些内容很繁琐,我做了一个简单的#define来完成它:

#define SOURCE __FILE__, __FUNCTION__, __LINE__

有没有办法可以在不使用宏的情况下实现相同的效果,使符号保留在Exceptions :: namespace中?我不太喜欢污染全球。

以下是对任何感兴趣的人的回购:

#include <iostream>
#include <exception>

namespace Exceptions
{
    class ExceptionBase : public std::exception
    {
    public:

        explicit ExceptionBase() : 
            Line(0), File(nullptr), Function(nullptr) {}

        explicit ExceptionBase(std::exception const & exception) : 
            std::exception(exception), Line(0), File(nullptr), Function(nullptr) {}

        explicit ExceptionBase(char const * file, char const * function, unsigned line) :
            File(file), Function(function), Line(line) {}

        explicit ExceptionBase(char const * message, char const * file, char const * function, unsigned line) :
            std::exception(message), File(file), Function(function), Line(line) {}

        ~ExceptionBase() {}

        unsigned Line;
        const char *File, *Function;
    };
}

#define SOURCE __FILE__, __FUNCTION__, __LINE__

int main(void)
{
    try
    {
        throw Exceptions::ExceptionBase(SOURCE);
    }
    catch(Exceptions::ExceptionBase const & base)
    {
        std::cout << "File: " << base.File << std::endl;
        std::cout << "Function: " << base.Function << std::endl;
        std::cout << "Line: " << base.Line << std::endl;
    }
}

0 个答案:

没有答案