Is there a way to define Variadic template macro?

旧街凉风 提交于 2020-01-07 09:56:06

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!