【发布时间】: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<1, 2, 5, 7, 10>( some_other_type ); 这不是我想要的。
我可以使用可变参数:
template <typename T>
T Foo( T tSomething, ... );
但是那样我就会失去我正在寻找的类型安全性。所以我的问题是,除了说使用std::initializer_list<std::size_t> 之外,C++11 中是否有其他方法,然后需要我按如下方式调用Foo:
Foo( some_other_type, {1, 2, 5, 7, 10} );
这意味着我无法解压缩参数来构造另一种类型。
编辑:我希望拥有类似于可变参数模板的东西以及为什么std::initializer_list 或Foo 的递归版本不起作用的原因是我有一个类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