は、Win32のランタイムダイナミックリンク機構の周りに、次のラッパーを考えてみましょう:コンパイル時に、型名が関数型typenameであるかどうかをどのように判断できますか?
#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_);
}
};
}
そして、たとえばクライアント:誰もがGetFunction
場所を使用しようとした場合
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");
基本的に、私はエラーメッセージを追加したいですT
は、関数ポインタ型以外のものです(なぜなら、私がここで強制的に使用するreinterpret_cast
はユーザエラーを隠す可能性があるからです)。
ブースト型形質を掘り起こすと、既存のis_function
テンプレートが見つかった。しかし、is_function
は関数への参照を受け入れます。私の場合はユーザエラーです(関数ポインタのみ)。
RuntimeDynamicLinker::GetFunction<T>()
を修正して、T
が関数ポインタ型でない場合、合理的に理解できるコンパイラエラーメッセージを生成するにはどうすればよいですか?
(サイドノート:私はTMPのいずれかの種類をやったことがないので、TMPの通常のユーザーに「基本」です物事の上に行くことを恐れてはいけません)私はあなたが形質を使うことができると思い
+1これは私が必要とするものを正確に行うように思われるためです。 (最初に他の答えがあるかどうかを確認するのを待っていますが) –
+1、これらの特性はC++ 0xで利用できますか? –
+1 [Boostの文書によれば、これはタイプが関数ポインタであるかどうかを検出する方法です](http://www.boost.org/doc/libs/1_45_0/libs/type_traits/doc/html/boost_typetraits/ reference/is_function.html)。 –