有没有办法像variadic宏一样定义可变参数模板宏?
例如,如果定义variadic宏,如:
#define PRINT_STRING(fmtId, ...) { \
CString fmt; \
fmt.FormatString(fmt, ##__VA_ARGS__); \
cout << fmt << endl; }
我们可以定义类似的内容:
#define PARSE_FUNCTION(functionName, typename...) \
std::function<int(typename...)> m_##functionName(){ \
return (std::function<int(typename...)>) functionName; }
答案 0 :(得分:1)
__VA_ARGS__
可以多次使用,因此您可以写:
#define PARSE_FUNCTION(functionName, ...) \
std::function<int(__VA_ARGS__)> m_##functionName() { \
return std::function<int(__VA_ARGS__)>(functionName); \
}
正在发生的事情只是简单的文本替换,预处理器不会检查参数是否为模板。
实际上,任何函数对象都可以隐式转换为std::function
,因此可以省略强制转换。此外,如果functionName
引用函数指针,则可以很容易地推断出确切的类型,您根本不需要可变参数宏:
#define PARSE_FUNCTION(functionName) \
auto m_##functionName() \
-> std::function<std::remove_pointer<decltype(functionName)>::type> \
{ \
return functionName; \
}