I was fed up with always having to write different code for x86 or x64 so I wrote intptr_cast<>.

Still a lot of things to think about here but I wrote those couple of lines as a sample.

I thought this might not only give you ideas but maybe trigger some comments:

// Cheap static_assert

template <bool> class static_assert;

template <> class static_assert<true> {};

 

template <typename T>

T intptr_cast(System::IntPtr intPtr) {

   static_assert< sizeof(T) == sizeof(void *) >();

   return reinterpret_cast<T>(intPtr.ToPointer());

}

(10/15/2007: I changed the code above to use ToPointer())

 

 

 

And a code sample on how to use this: 

 


void Cache::Pin(array<String ^> ^ pathsToPin, PinningBehaviour pinningBehaviour, bool pinSubdirectories, bool asynchronously, IntPtr parentWindow ) {

   LastPinningEventRaised = LastEventRaised::None;

   const wchar_t * * paths = NULL;

   try {

      paths = ConstructSingleNativeBuffer(pathsToPin);

 

      if (!_pinningProgress) {

         _pinningProgress = new Progress(this, ProgressSource::Pinning);

      }

 

      Tif(_cache->Pin(intptr_cast<HWND>(parentWindow),

                      paths,

                      pathsToPin->Length,

                      pinSubdirectories,

                      asynchronously,

                      safe_cast<DWORD>(pinningBehaviour),

                      safe_cast<IOfflineFilesSyncProgress *>(_pinningProgress)));

   } finally {

      delete [] paths;

   }

}

 

Of course, you could use this for HBRUSH, HPEN, HANDLE, ...

 

May the force be with you.