【问题标题】:Accepting a variable number of parameters of the same type [duplicate]接受可变数量的相同类型的参数[重复]
【发布时间】:2014-08-17 17:01:02
【问题描述】:

我正在尝试实现一个函数,它可以采用任意数量的std::size_t 变量并相应地使用它们。

我希望能够调用该函数(为了论证,我们称它为Foo)如下:

Foo( some_other_type, 1, 2, 5, 7, 10 );

我尝试了以下方法:

template <typename T, std::size_t... Coords>
T Foo( T tSomething, Coords... coords );

但这不起作用,如果我删除了最后一个参数,因此它是有效的 C++ 语法,我将不得不按如下方式调用它 Foo&lt;1, 2, 5, 7, 10&gt;( some_other_type ); 这不是我想要的。

我可以使用可变参数:

template <typename T>
T Foo( T tSomething, ... );

但是那样我就会失去我正在寻找的类型安全性。所以我的问题是,除了说使用std::initializer_list&lt;std::size_t&gt; 之外,C++11 中是否有其他方法,然后需要我按如下方式调用Foo

Foo( some_other_type, {1, 2, 5, 7, 10} );

这意味着我无法解压缩参数来构造另一种类型。


编辑:我希望拥有类似于可变参数模板的东西以及为什么std::initializer_listFoo 的递归版本不起作用的原因是我有一个类Bar,其构造函数需要可变数量的参数取决于具体的实例化,我希望做类似以下的事情:

template <typename T, std::size_t... Coords>
T Foo( T tSomething /*, Coords... coords*/ )
{
    Bar<sizeof...(Coords)> bar( /*coords...*/ Coords... );
    // Do stuff...
    return bar.tProperty;
}

但我希望能够如上所述调用Foo,而不是使用模板列表。

【问题讨论】:

  • @nosid 我更新了我的问题以解释为什么这不是那个问题的重复。
  • @Shaktal 那么它是stackoverflow.com/q/3703658 的副本,或者可能是几十个类似问题之一(这表明我们需要更好的语言支持 IMO)。
  • this。是我对一个几乎相同的问题的回答。我的回答解释了如何通过编译时谓词和static_assert() 来实现统一类型以获取有用的错误消息。

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


【解决方案1】:

起初我发现这个解决方案有点违反直觉。您需要一个“typename ... Coords”,而不是将其声明为 size_t。这是因为您希望编译器填写类型名。

您可以通过强制将其用作 size_t 来确保类型安全。

template <typename T, typename... Coords>
T Foo( T tSomething, const Coords... coords )
{
    std::array<size_t, sizeof...(Coords)>unpacked_coords {coords...};
    for (size_t coord : unpacked_coords)
    {
        // do stuff
    }
    return tSomething;

}

你现在可以这样调用:

Foo( some_other_type, 1, 2, 5, 7, 10 );

如你所愿:)

【讨论】:

  • “虽然您可能需要明确地将数字创建为 size_t” 为什么您需要这样做?
  • @dyp 没有 size_t 初始化,数字是 int,并且大小可能与 size_t 不同。
  • 那么,有什么问题?
  • 发现问题。 coords 需要是 const 才能发送整数。
  • ???我不认为 Coords 必须是 const 才能接受整数。您是否有一个显示问题的最小完整示例?
猜你喜欢
  • 2015-04-25
  • 2013-08-03
  • 1970-01-01
  • 2011-03-08
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多