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 *
类型。