Один случай, когда reinterpret_cast
необходимо, при взаимодействии через интерфейс с непрозрачными типами данных. Это часто происходит в API поставщика, над которыми программист не имеет никакого контроля. Вот изобретенный пример, где поставщик обеспечивает API для того, чтобы сохранить и получить произвольные глобальные данные:
// vendor.hpp
typedef struct _Opaque * VendorGlobalUserData;
void VendorSetUserData(VendorGlobalUserData p);
VendorGlobalUserData VendorGetUserData();
Для использования этого API программист должен бросить их данные к VendorGlobalUserData
и назад снова. static_cast
не будет работать, нужно использовать reinterpret_cast
:
// main.cpp
#include "vendor.hpp"
#include <iostream>
using namespace std;
struct MyUserData {
MyUserData() : m(42) {}
int m;
};
int main() {
MyUserData u;
// store global data
VendorGlobalUserData d1;
// d1 = &u; // compile error
// d1 = static_cast<VendorGlobalUserData>(&u); // compile error
d1 = reinterpret_cast<VendorGlobalUserData>(&u); // ok
VendorSetUserData(d1);
// do other stuff...
// retrieve global data
VendorGlobalUserData d2 = VendorGetUserData();
MyUserData * p = 0;
// p = d2; // compile error
// p = static_cast<MyUserData *>(d2); // compile error
p = reinterpret_cast<MyUserData *>(d2); // ok
if (p) { cout << p->m << endl; }
return 0;
}
Ниже изобретенная реализация демонстрационного API:
// vendor.cpp
static VendorGlobalUserData g = 0;
void VendorSetUserData(VendorGlobalUserData p) { g = p; }
VendorGlobalUserData VendorGetUserData() { return g; }
делает ли это так, что невозможно открыть два экземпляра одновременно?
Да.
Да, это делает невозможным открытие двух экземпляров одновременно.
Однако очень важно знать об ошибках . С некоторыми брандмауэрами невозможно открыть даже один экземпляр - ваше приложение вылетает при запуске! См. прекрасную статью Билла Маккарти для получения дополнительных сведений и техники ограничения вашего приложения одним экземпляром. Его метод передачи аргумента командной строки из второго экземпляра обратно в первый использует конвейеры в .NET 3.5.
Да, вы правы в том, что это позволит открывать только один экземпляр вашего приложения за раз.