static_cast<>
не выполняет проверку типов во время выполнения, поэтому то, что у вас есть, не будет работать, по крайней мере, не так, как вы думаете. Все, что static_cast<>
делает - это арифметика указателей, основанная на информации, известной во время компиляции.
dynamic_cast<>
может работать , но для этого требуется, чтобы в классе была хотя бы одна виртуальная функция (для RTTI), и он наверняка потерпит неудачу, если LPARAM
даже не является указателем на что-то это тип класса.
Не существует общего способа определить, учитывая произвольный указатель или целочисленное значение, например LPARAM
, что он фактически указывает на экземпляр MyClass
.
Что бы я сделал в вашей конкретной ситуации - это обернуть представление списка в его собственный класс и предоставить методы, которые работают только с MyClass
. Возможно так:
class MyListView
{
public:
MyListView() { /* create the list view HWND */ }
~MyListView() { /* destroy the list view HWND */ }
void Add(MyClass* listItem) // Only way to add items to list view
{
// Add to list view
}
MyClass* Get() const
{
LVITEM lv;
// lv is filled in by LVM_GETITEM
// Assume that this will work, since the only way to add
// list view items is through Add(), and Add() only accepts
// an instance of MyClass. Therefore the list view will only
// have pointers to instances of MyClass.
return static_cast<MyClass*>((void*)lv.lParam);
}
// ...
private:
// Set to private so users can't modify
// the list view without our consent.
HWND listView;
};
Преимущество этого метода в том, что теперь у вас есть полный контроль над элементом управления представлением списка и его интерфейсом, и, таким образом, он всегда будет работать (несмотря на ошибки и злые / некомпетентные программисты). Вы даже можете сделать его шаблоном, чтобы он работал с классами, отличными от MyClass
.