从C ++中的基本实例获取派生类的类型名称

时间:2013-05-17 14:52:03

标签: c++ exception inheritance polymorphism

我正在为C ++项目创建一个通用的错误处理程序。作为日志记录的一部分,我想要包含异常类的名称。我希望有一种方法可以从std :: exception实例中获取特定错误类的名称,而无需使用dynamic_cast和逻辑树。

示例:

exception_handler.h

#pragma once

#include <exception>
#include <string>

class ExceptionHandler
{
public:
    static std::string get_exception_type_name(std::exception ex)
    {
        return ((std::string)typeid(ex).name()).substr(11);
    }
};

的main.cpp

#include <iostream>
#include "exception_handler.h"

int _tmain(int argc, _TCHAR* argv[])
{
    std::string any = "any";
    std::out_of_range ex("Out of range exception");

    std::cout << ExceptionHandler::get_exception_type_name(ex) << std::endl;

    std::cout << "Press any key to close this window..." << std::endl;
    std::cin >> any; 
}   

执行输出“异常”。我希望它能说出“out_of_range”或者我提供给函数的任何其他类型的派生异常。

提前致谢。

1 个答案:

答案 0 :(得分:1)

论证是sliced。通过const&代替价值:

static std::string get_exception_type_name(std::exception const& ex)
{                                                       //^^^^^^
    return typeid(ex).name();
}

例如,请参阅http://ideone.com/LWoxgm