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