function_traits 使用可变模板和 va_args
function_traits with varidic tempate and va_args
前段时间遇到过这样的用法:
template <typename Return, typename ... Args>
struct function_traits<Return(*)(Args......)>{};
其中上面是 Args 的可变参数扩展,后面是 C 风格的可变参数。
最近在另一个媒体上讨论这个,对方认为这样做仍然有效:
template <typename Return, typename ... Args>
struct function_traits<Return(*)(Args...,...)>{};
他们认为逗号是允许的。但是以前我被迫使用......,但我不记得为什么。它绝对是在 Whosebug 上,但它是在一个不相关的主题上,我再也找不到它了。我确实记得一些关于 MSVC 错误的事情,它可能迫使我省略了逗号。
问题:
- 这两种形式的 varidic 扩展在该上下文中都有效吗?如果不是,为什么?;或
- 有人知道我记得读过的讨论在哪里吗?;在这种情况下关闭主题然后在此处链接将帮助其他人找到答案。我再也找不到它了,所以我想其他人也会有同样的问题。
Are both forms of the varidic expansion valid in that context, if not why?
两种形式都有效。语法产生的相关部分在[dcl.fct]/3
parameter-declaration-clause:
parameter-declaration-listopt ...opt
parameter-declaration-list , ...
无论哪种方式,parameter-declaration-list
都可以跟随形成模板参数包扩展的产生式(这就是第二组 ...
的来源)。
前段时间遇到过这样的用法:
template <typename Return, typename ... Args>
struct function_traits<Return(*)(Args......)>{};
其中上面是 Args 的可变参数扩展,后面是 C 风格的可变参数。
最近在另一个媒体上讨论这个,对方认为这样做仍然有效:
template <typename Return, typename ... Args>
struct function_traits<Return(*)(Args...,...)>{};
他们认为逗号是允许的。但是以前我被迫使用......,但我不记得为什么。它绝对是在 Whosebug 上,但它是在一个不相关的主题上,我再也找不到它了。我确实记得一些关于 MSVC 错误的事情,它可能迫使我省略了逗号。
问题:
- 这两种形式的 varidic 扩展在该上下文中都有效吗?如果不是,为什么?;或
- 有人知道我记得读过的讨论在哪里吗?;在这种情况下关闭主题然后在此处链接将帮助其他人找到答案。我再也找不到它了,所以我想其他人也会有同样的问题。
Are both forms of the varidic expansion valid in that context, if not why?
两种形式都有效。语法产生的相关部分在[dcl.fct]/3
parameter-declaration-clause: parameter-declaration-listopt ...opt parameter-declaration-list , ...
无论哪种方式,parameter-declaration-list
都可以跟随形成模板参数包扩展的产生式(这就是第二组 ...
的来源)。