【问题标题】:Is there a way to define Variadic template macro?有没有办法定义可变参数模板宏?
【发布时间】:2013-04-16 01:39:08
【问题描述】:

有没有办法像定义可变参数宏一样定义可变参数模板宏?

例如,如果定义可变参数宏:

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

【问题讨论】:

  • 什么?你能更详细地解释你想要什么吗,我没明白...
  • 宏和模板不是一回事。这看起来像一个 XY 问题。解释你想要实现的目标是什么,而不是你试图如何做到这一点。
  • 谢谢,是的,我认为这也是一个愚蠢的问题 :)
  • @Nicol:我无法理解你的评论!为什么有人不应该编写一个包含模板的宏?宏不是 c/c++ 不好的一面,这不是问题,但仍有理由使用它们。确实:我也看不懂代码示例:-)
  • @Klaus:这与是否有人可以将模板放入宏中无关。就是没有“宏模板”这样的东西。他们做不同的事情。

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


【解决方案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; \
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多