【发布时间】:2023-04-04 14:57:01
【问题描述】:
问题很简单——我无法在 ISO C++ 文档中找到更好的示例:
template<class ... targs> void func(targs ... args);
但即便如此,我也找不到令人满意的解释。这不是我想要的,因为我不关心参数类型。
我想写这样的东西:
void func(auto ... args)
{
func1(args...); //here 'args' to be expanded
}
但上述或其他类似的表示在 Clang 下无法编译。
任何想法为什么以及如何做到这一点?也欢迎引用最新的 ISO C++ 标准。
我想要做的是通过我自己的函数实现“新”运算符行为,为此我需要传递具有可变大小的构造函数参数,如下所示:
struct x_new
{
template<class T>
inline T *allocate(... arg)
{
return new T(arg...);
}
};
目前在 Clang 下无法编译,我不知道为什么。
【问题讨论】:
-
clang 对
template<class ... targs> void func(targs ... args);没有任何问题。它也很乐意接受你为它编写的正文。你的问题到底是什么? -
这不是一个单一的命名参数包,而是别的东西。它是什么?还有为什么我不能写第二个?
-
你想做什么?你能展示你想如何使用你的功能吗?你真正想解决什么问题?相关阅读:What is the XY problem.
-
您似乎以某种方式将模板函数与可变参数(实际上是一个整数函数,根据您调用函数的内容进行实例化)和 C 风格的可变参数混淆了。您似乎还对
auto做了一些有趣的假设。请注意,auto不是“魔术类型删除”之类的东西,它有非常明确(和严格)的规则。如果你写auto,编译器需要一种方法来派生正确的类型,这不是这里的情况。 -
“命名参数包”不是一个标准术语,我不知道你的意思。
args是一个参数包,在我看来它是命名的,那为什么不是命名参数包呢?至于第二个有什么问题,clang 的信息对我来说似乎很清楚:你不能将参数声明为auto。
标签: c++ parameters clang iso pack