Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

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; }
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
1.2k views
Welcome To Ask or Share your Answers For Others

1 Answer

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...