Betrachten Sie die folgende Wrapper um Runtime Dynamic Linking Mechanismus Win32:Wie kann ich (zur Kompilierzeit) feststellen, ob ein Typname ein Funktionszeiger Typname ist?
#include <boost/noncopyable.hpp>
#include <windows.h>
#include "Exception.hpp"
namespace WindowsApi
{
class RuntimeDynamicLinker : boost::noncopyable
{
HMODULE hMod_;
public:
RuntimeDynamicLinker(const wchar_t * moduleName)
{
hMod_ = LoadLibraryW(moduleName);
if (hMod_ == 0)
{
Exception::Throw(GetLastError());
}
}
template <typename T>
T GetFunction(const char* functionName)
{
FARPROC result = GetProcAddress(hMod_, functionName);
if (result == 0)
{
Exception::Throw(GetLastError());
}
return reinterpret_cast<T>(result);
}
~RuntimeDynamicLinker()
{
FreeLibrary(hMod_);
}
};
}
Und ein Beispiel Client:
typedef NTSTATUS (NTAPI * NtQueryInformationProcess_t)(
IN HANDLE,
IN PROCESS_INFORMATION_CLASS,
OUT PVOID,
IN ULONG,
OUT PULONG);
RuntimeDynamicLinker ntdll(L"ntdll.dll");
NtQueryInformationProcess_t NtQueryInformationProcess =
ntdll.GetFunction<NtQueryInformationProcess_t>("NtQueryInformationProcess");
Grundsätzlich würde Ich mag eine Fehlermeldung hinzufügen, wenn jemand zu verwenden GetFunction
versucht, wo T
ist alles andere als eine Funktion Zeigertyp (weil die reinterpret_cast
ich hier gezwungen bin, könnte sonst Benutzerfehler verstecken).
Graben durch Boost Typ Eigenschaften, ich habe festgestellt, dass es eine bestehende is_function
Vorlage gibt. is_function
akzeptiert jedoch Verweise auf Funktionen, was in meinem Fall ein Benutzerfehler wäre (Funktion Zeiger nur). Wie kann ich RuntimeDynamicLinker::GetFunction<T>()
ändern, um eine verständliche Compiler-Fehlermeldung zu erzeugen, wenn T
kein Funktionszeigertyp ist?
(Randbemerkung: Ich habe nie irgendeine Art von TMP getan, also keine Angst, über Dinge zu gehen, die „Basis“, um regelmäßige Nutzer von TMP) sind
+1, weil dies genau das zu tun scheint, was ich brauche. (obwohl warten, um zu sehen, ob es zuerst andere Antworten gibt) –
+1, und werden diese Merkmale in C++ 0x verfügbar sein? –
+1 weil [gemäß der Boost-Dokumentation erkennt man, ob ein Typ ein Funktionszeiger ist] (http://www.boost.org/doc/libs/1_45_0/libs/type_traits/doc/html/boost_typetraits/ Referenz/is_function.html). –