__VA_ARGS__
can be used multiple times, so you could write:
#define PARSE_FUNCTION(functionName, ...)
std::function<int(__VA_ARGS__)> m_##functionName() {
return std::function<int(__VA_ARGS__)>(functionName);
}
What is happening is just simple text substitution, whether the arguments is for a template or not won't be checked by the preprocessor.
Actually any function objects can be implicitly converted to a std::function
, so the cast can be omitted. Furthermore, if functionName
refers to function pointers, the exact type can be easily inferred, that you don't need the variadic macro at all:
#define PARSE_FUNCTION(functionName)
auto m_##functionName()
-> std::function<std::remove_pointer<decltype(functionName)>::type>
{
return functionName;
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…