-5

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; }
4

1 回答 1

1

__VA_ARGS__可以多次使用,所以你可以写:

#define PARSE_FUNCTION(functionName, ...) \
    std::function<int(__VA_ARGS__)> m_##functionName() { \
        return std::function<int(__VA_ARGS__)>(functionName); \
    }

正在发生的只是简单的文本替换,预处理器不会检查参数是否用于模板。

实际上,任何函数对象都可以隐式转换为 a std::function,因此可以省略强制转换。此外,如果functionName引用函数指针,可以很容易地推断出确切的类型,即您根本不需要可变参数宏:

#define PARSE_FUNCTION(functionName) \
    auto m_##functionName() \
        -> std::function<std::remove_pointer<decltype(functionName)>::type> \
    { \
        return functionName; \
    }
于 2013-04-23T08:01:02.947 回答