C++将地址转换为字符串

C++将地址转换为字符串

有时候在做程序设计的时候,有可能需要做一个类似messageBus的功能,并且需要一个key保证唯一,那么如何实现这个key的唯一呢?大致两种思路:

  • 使用函数签名,因为messagebus绑定的是一个函数,并且对应一个topic,但是为了能够自适应各式各样的函数,就需要模板和元编程来解决,但是这样的局限很大,有一些函数我们是无法获取签名的(你一定会需要的);
  • 使用函数地址,这种方式是相对最方便的,由于函数地址是唯一的,这样我们就可以生成唯一的key,但是难就难在如何获取函数地址,并且转换成字符串。

案例

class TestMsg
{
public:

    void test()
    {
        std::cout << "test class no const test " << std::endl;
    }

    void test1()
    {
        std::cout << "test class no const test1" << std::endl;
    }
};

测试

   TestMsg msg;
    vector<TestMsg> tests;

    size_t cnt = 1000000;
    tests.resize(cnt);

    for( size_t i = 0; i < cnt; ++i )
    {
        tests[i] = TestMsg();
    }
    auto fp = &TestMsg::test;

    auto start = std::chrono::steady_clock::now();

    for( size_t i = 0; i < cnt; ++i )
    {
        reinterpret_cast<void*>(&fp);
        std::stringstream ss1;
        ss1 << ss << &tests[i];
        std::string name = ss1.str();
    }

    auto end = std::chrono::steady_clock::now();
    std::cout << std::chrono::duration<double, std::milli>(end -start).count() << " ms" << std::endl;

主要转换是通过stringstream这个类,使用它的前提是转换成void *类型。

发布了145 篇原创文章 · 获赞 357 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/wf19930209/article/details/90667311