KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I'm trying to wrap the Windows API functions to check errors when I so choose. As I found out in a previous SO question, I could use a template function to call the API function, and then call GetLastError() to retrieve any error it might have set. I could then pass this error to my Error class to let me know about it. Here's the code for the template function: template<typename TRet, typename... TArgs> TRet Wrap(TRet(WINAPI *api)(TArgs...), TArgs... args) { TRet ret = api(args...); //check for errors return ret; } Using this I can have code as follows int WINAPI someFunc (int param1, BOOL param2); //body not accessible int main() { int ret = someFunc (5, true); //works normally int ret2 = Wrap (someFunc, 5, true); //same as above, but I'll get a message if there's an error } This works wonderfully. However, there is one possible problem. Take the function void WINAPI someFunc(); When subbing this into the template function, it looks as follows: void Wrap(void(WINAPI *api)()) { void ret = api(); //<-- ahem! Can't declare a variable of type void... //check for errors return ret; //<-- Can't return a value for void either } To get around this, I tried creating a version of the template where I replaced TRet with void . Unfortunately, this actually just causes an ambiguity of which one to use. That aside, I tried using if (strcmp (typeid (TRet).name(), "v") != 0) //typeid(void).name() == "v" { //do stuff with variable to return } else { //do stuff without returning anything } However, typeid is a runtime comparison, so the code still doesn't compile due to trying to declare a void variable, even if it never will. Next, I tried using std::is_same <TRe
Tags (comma-separated)
Save Edits
Cancel