GetProcAddressで戻り値をキャストするのが面倒くさいので少し考えてみた

その1。

typedef void (__stdcall * Func)();
template<class F>
F GetProcAddress2(HMODULE module, LPCSTR name)
{
	F f = reinterpret_cast<F>(::GetProcAddress(module, name));
	_ASSERT(f);
	return f;
}
Func f = GetProcAddress2<Func>(dll, "Func");

ってASSERT挟んだだけじゃないか。

その2。

template<class F>
bool GetProcAddress3(HMODULE module, LPCSTR name, F& f)
{
	f = reinterpret_cast<F>(::GetProcAddress(module, name));
	_ASSERT(f);
	return f != 0;
}
Func f;
GetProcAddress3(dll, "Func", f);

戻り値で返したいのっ。でもこの辺りで落とすしかないかなぁ。

おまけ。

template<class F>
F GetProcAddress4(HMODULE module, LPCSTR name, F&)
{
	F f = reinterpret_cast<F>(::GetProcAddress(module, name));
	_ASSERT(f);
	return f;
}
Func f = GetProcAddress4(dll, "Func", f);

さすがに抵抗が……。

追記

トラックバックとコメントで言及頂きました。

GetProcAddressの戻り値をキャストしなくて済むようにする - #3(2008-03-28)

素敵すぎます。型変換演算子は左辺の型を指定しなくても勝手に推定してくれるんですね。知りませんでした。