Getting a function name (__func__) from a class T and a pointer to member function void(T::*pmf)()

后端 未结 2 800
太阳男子
太阳男子 2021-01-16 06:14

Is it possible to write some f() template function that takes a type T and a pointer to member function of signature void(T::*pmf)() a

2条回答
  •  野趣味
    野趣味 (楼主)
    2021-01-16 06:53

    It seems like what you are trying to achieve, is to get the name of the calling function in assert_test(). With gcc you can use backtace to do that. Here is a naive example:

    #include 
    #include 
    #include 
    
    namespace unit_test 
    {
    struct test {};
    }
    
    std::string get_my_caller()
    {
        std::string caller("???");
        void *bt[3];                             // backtrace
        char **bts;                              // backtrace symbols
        size_t size = sizeof(bt)/sizeof(*bt);
        int ret = -4;
    
        /* get backtrace symbols */
        size = backtrace(bt, size);
        bts = backtrace_symbols(bt, size);
    
        if (size >= 3) {
            caller = bts[2];
    
            /* demangle function name*/
            char *name;
            size_t pos = caller.find('(') + 1;
            size_t len = caller.find('+') - pos;
    
            name = abi::__cxa_demangle(caller.substr(pos, len).c_str(), NULL, NULL, &ret);
    
            if (ret == 0)
                caller = name;
    
            free(name);
        }
    
        free(bts);
    
        return caller;
    }
    
    void assert_test(bool expression, const std::string& message)
    {
        if (!expression)
            std::cout << "ASSERTION FAILED " << get_my_caller() << ": " <<  message << std::endl;
    }
    
    
    struct my_test_case : public unit_test::test 
    {
        void some_test()
        {
            assert_test(false, "test failed.");
        }
    };
    
    int main() 
    {
        my_test_case tc;
        tc.some_test();
    
        return 0;
    }
    

    Compiled with:

    g++ -std=c++11 -rdynamic main.cpp -o main
    

    Output:

    ASSERTION FAILED my_test_case::some_test(): test failed.
    

    Note: This is a gcc (linux, ...) solution, which might be difficult to port to other platforms!

提交回复
热议问题