有没有办法定义Variadic模板宏?

时间:2013-04-23 01:04:05

标签: c++ c++11 variadic-templates

有没有办法像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; }

1 个答案:

答案 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; \
    }