c++ - 从类 T 获取函数名 (__func__) 和指向成员函数 void(T::*pmf)() 的指针

标签 c++ function unit-testing pointer-to-member

是否可以写一些f()采用类型的模板函数 T和指向签名成员函数的指针 void(T::*pmf)()作为(模板和/或函数)参数并返回 const char*指向成员函数的 __func__变量(或损坏的函数名称)?

编辑:我被要求解释我的用例。我正在尝试编写一个单元测试库(我知道有一个 Boost Test 库用于此目的)。 我的目标是完全不使用任何宏:

struct my_test_case : public unit_test::test {
    void some_test()
    {
        assert_test(false, "test failed.");
    }
};

我的测试套件运行器将调用 my_test_case::some_test()如果它的断言失败,我希望它记录:

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

我可以使用 <typeinfo>获取类的名称,但指向成员函数的指针只是一个偏移量,这不会向用户提供关于正在调用的测试函数的任何线索。

最佳答案

看起来您要实现的目标是获取 assert_test() 中调用函数的名称。使用 gcc 你可以使用 backtace要做到这一点。这是一个天真的例子:

#include <iostream>
#include <execinfo.h>
#include <cxxabi.h>

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;
}

编译:

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

输出:

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

注意:这是一个 gcc(linux,...)解决方案,可能很难移植到其他平台!

关于c++ - 从类 T 获取函数名 (__func__) 和指向成员函数 void(T::*pmf)() 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32880969/

相关文章:

python - 如何在 Buildout 中对我的 Python 代码运行单元测试?

c# - 在 HttpContext.Current.Request 中模拟 ServerVariables

java - 将方法传递给方法的解决方法?

function - 对于良好的日常习惯来说,哪一个特征最重要?

c++ - 一堆函数指针 : how to call the function?

java - 为什么我的删除测试方法找不到 id 7 的用户?

c++ - 如何使用 std::bind 编译 C++ 程序?

c++ - 替换 Dll 中的类以进行单元测试

c++ - 跨平台自动运行

c++ - 使类构造函数私有(private)