Transform macro defined function to templated auto function call

General Tech Bugs & Fixes 2 years ago

0 1 0 0 0 tuteeHUB earn credit +10 pts

5 Star Rating 1 Rating

Posted on 16 Aug 2022, this text provides information on Bugs & Fixes related to General Tech. Please note that while accuracy is prioritized, the data presented might not be entirely correct or up-to-date. This information is offered for general knowledge and informational purposes only, and should not be considered as a substitute for professional advice.

Take Quiz To Earn Credits!

Turn Your Knowledge into Earnings.

tuteehub_quiz

Answers (1)

Post Answer
profilepic.png
manpreet Tuteehub forum best answer Best Answer 2 years ago

 

Currently dealing with some legacy code that defines a macro'ed function and uses the macro param to stamp out a C-style cast and a look up table (array) - note they're all just enums

#define DEFINE_ENUM_RW(a)                                           \
BOOL    r##a(CXMLObject* pxml, void* object, S_XML_TAG * item)   \
...
##a *pc = (##a*)ptr;
...
*pc = (##a)nameENid(s, lut##a);

What I would like to do is pass the enum & array as template parameters so I don't have to alter the function signature as follows:

template <typename T, typename U>
bool xmlReadEnum(CXMLObject* pxml, void* object, S_XML_TAG* item)
...
auto pc = reinterpret_cast<T*>ptr;
...
*pc = static_cast<T>nameENid(st, U);

And then use a simpler macro definition to lay out the function declaration:

#define DEFINE_ENUM_RW(a) \
std::function<bool(CXMLObject*, void*, S_XML_TAG*)> r##a = xmlReadEnum<##a, lut##a>;

But this results in a compilation error

no suitable constructor exists to convert from "" to "std::function"

I'm not entirely sure if my approach is feasible here or if there's a simpler approach that would be more appropriate? If it is a reasonable approach I'm not sure what is missing to allow this to compile?

No matter what stage you're at in your education or career, TuteeHub will help you reach the next level that you're aiming for. Simply,Choose a subject/topic and get started in self-paced practice sessions to improve your knowledge and scores.