Interoperating with C APIs in C++ can sometimes be a challenge, especially when dealing with varying data types. The std::any
feature introduced in C++17 can be used effectively for this purpose. It allows you to store a value of any type, which can help bridge the gap between C-style APIs and C++ type-safe features. Here is how you can do it:
#include
#include
extern "C" {
typedef void* MyCHandle;
MyCHandle CreateHandle(int value) {
return reinterpret_cast(new std::any(value));
}
int GetValue(MyCHandle handle) {
if (handle) {
return std::any_cast(*(std::any*)handle);
}
return 0;
}
void DestroyHandle(MyCHandle handle) {
delete reinterpret_cast<:any>(handle);
}
}
int main() {
MyCHandle handle = CreateHandle(42);
std::cout << "Value: " << GetValue(handle) << std::endl;
DestroyHandle(handle);
return 0;
}
How do I avoid rehashing overhead with std::set in multithreaded code?
How do I find elements with custom comparators with std::set for embedded targets?
How do I erase elements while iterating with std::set for embedded targets?
How do I provide stable iteration order with std::unordered_map for large datasets?
How do I reserve capacity ahead of time with std::unordered_map for large datasets?
How do I erase elements while iterating with std::unordered_map in multithreaded code?
How do I provide stable iteration order with std::map for embedded targets?
How do I provide stable iteration order with std::map in multithreaded code?
How do I avoid rehashing overhead with std::map in performance-sensitive code?
How do I merge two containers efficiently with std::map for embedded targets?