diff options
author | John Ankarström <john@ankarstrom.se> | 2022-07-18 03:25:00 +0200 |
---|---|---|
committer | John Ankarström <john@ankarstrom.se> | 2022-07-18 03:25:00 +0200 |
commit | 53abfac6acd04dff80ec6c8cfb0dd53f2f74dadb (patch) | |
tree | e0e6ef0926e3fb77a96874fa39d7d71fcceae942 /c/common.h | |
parent | 03d9db8d5ff22faa27ab25264727bb09ba87d66d (diff) | |
download | EpisodeBrowser-53abfac6acd04dff80ec6c8cfb0dd53f2f74dadb.tar.gz |
Improve Library::GetProcAddress.
It isn't really more safe, but it removes the need for a confusing
function pointer cast, which is easy to get wrong. As far as the
compiler is concerned, the result is literally the same, but it does
force the caller to (indirectly, via the template parameter) cast the
return value, which may be a good thing.
Diffstat (limited to 'c/common.h')
-rw-r--r-- | c/common.h | 30 |
1 files changed, 18 insertions, 12 deletions
@@ -27,23 +27,15 @@ struct Library { Library(const TCHAR* tszLibrary); ~Library(); - void* GetProcAddress(const char* szProc); + template <typename T> T* GetProcAddress(const char* szProc); private: HMODULE m_hModule; }; -inline int Cmp(const int a, const int b) +template <typename T> +T* Library::GetProcAddress(const char* const szProc) { - if (a == b) return 0; - if (a > b) return 1; - return -1; -} - -/* Return integer scaled for current DPI. */ -inline int Dpi(const int i) -{ - extern int g_iDPI; - return MulDiv(i, g_iDPI, 96); + return (T*)(void*)::GetProcAddress(m_hModule, szProc); } /* Create and return an object of type C. If construction fails, @@ -59,4 +51,18 @@ std::optional<C> try_make(T ...args) } } +/* Return integer scaled for current DPI. */ +inline int Dpi(const int i) +{ + extern int g_iDPI; + return MulDiv(i, g_iDPI, 96); +} + +inline int Cmp(const int a, const int b) +{ + if (a == b) return 0; + if (a > b) return 1; + return -1; +} + #endif |