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 )
{void* ss = 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 *
类型。