【问题标题】:How to name a single function-parameter-pack?如何命名单个函数参数包?
【发布时间】: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&lt;class ... targs&gt; void func(targs ... args); 没有任何问题。它也很乐意接受你为它编写的正文。你的问题到底是什么?
  • 这不是一个单一的命名参数包,而是别的东西。它是什么?还有为什么我不能写第二个?
  • 你想做什么?你能展示你想如何使用你的功能吗?你真正想解决什么问题?相关阅读:What is the XY problem.
  • 您似乎以某种方式将模板函数与可变参数(实际上是一个整数函数,根据您调用函数的内容进行实例化)和 C 风格的可变参数混淆了。您似乎还对auto 做了一些有趣的假设。请注意,auto 不是“魔术类型删除”之类的东西,它有非常明确(和严格)的规则。如果你写auto,编译器需要一种方法来派生正确的类型,这不是这里的情况。
  • “命名参数包”不是一个标准术语,我不知道你的意思。 args 是一个参数包,在我看来它是命名的,那为什么不是命名参数包呢?至于第二个有什么问题,clang 的信息对我来说似乎很清楚:你不能将参数声明为auto

标签: c++ parameters clang iso pack


【解决方案1】:

像往常一样使用普通模板参数包怎么样?比如说

template<typename T, typename... argsT>
T *allocate(argsT... args)
{
    return new T(std::forward<argsT>(args)...);
}

【讨论】:

  • 更好的是,使用std::forward。但是,是的,参数包的这种使用是正确的。值得注意的是,调用allocate&lt;T&gt; 仍然允许从实际参数中推断出argsT,它没有为包指定一个固定但为空的集合。
  • std::forward的使用方式是std::forward&lt;argsT&gt;(args)...。您需要指定模板参数,因为它不能从args 有意义地推导出来,因为它们总是左值。 ... 需要在调用之外,因为您需要为每个参数调用 std::forward。只要您只有一个参数,它似乎就可以正常工作,但如果您有更多参数,或者没有参数,它就会中断。
  • @hvd 谢谢,我还没有完全了解所有新东西。
  • 我还想引用 ISO C++ 标准来解释这是什么以及为什么我的第二个示例无效。
猜你喜欢
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 2016-07-26
  • 2013-04-09
  • 1970-01-01
相关资源
最近更新 更多