问题
Is there a way to define variadic template macro just like variadic macro?
For example, if define variadic macro like:
#define PRINT_STRING(fmtId, ...) { \
CString fmt; \
fmt.FormatString(fmt, ##__VA_ARGS__); \
cout << fmt << endl; }
Could we define something like:
#define PARSE_FUNCTION(functionName, typename...) \
std::function<int(typename...)> m_##functionName(){ \
return (std::function<int(typename...)>) functionName; }
回答1:
__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; \
}
来源:https://stackoverflow.com/questions/16159204/is-there-a-way-to-define-variadic-template-macro