问题是
{8, 8, 8}
不能作为类型推导。
如果将它传递给接收
const std::vector<int>
,一切顺利,因为编译器知道
_8、8、8_
用于初始化
std::vector<int>
.
但如果将它传递给接收变量列表的函数(
Args&&... args
的)
未知类型
参数,这不起作用,因为编译器不知道witch类型是
_8、8、8_
.
建议:以可变方式传递值
auto v = makeVector<MyLoader>(8, 8, 8);
所以编译器可以检测
Args...
作为
int, int, int
,并传递给
load()
添加图形
// ------------------V-----------------------------V
return Loader::load( { std::forward<Args>(args)... } );
如果你真的(真的!)希望将th值传递给
makeVector()
作为初始化列表,可以作为数组截取它们
template <typename Ldr, std::size_t Dim, typename Arg>
auto makeVector (Arg(&&arg)[Dim])
所以编译器可以推断(
Arg
作为
int
)以及尺寸(
Dim
,
3
万一
_8、8、8_
.
但要解包数组,需要索引,所以需要一个函数助手。
有点像
template <typename Ldr, std::size_t ... Is, std::size_t Dim, typename Arg>
auto makeVectorH (std::index_sequence<Is...> const &, Arg(&&arg)[Dim])
{ return Ldr::load({std::forward<Arg>(arg[Is])...}); }
template <typename Ldr, std::size_t Dim, typename Arg>
auto makeVector (Arg(&&arg)[Dim])
{ return makeVectorH<Ldr>(std::make_index_sequence<Dim>{},
std::forward<Arg[Dim]>(arg)); }
下面是一个完全编译C++实例14的例子(但是我建议使用可变的参数)
#include <vector>
#include <utility>
#include <iostream>
struct MyLoader
{ static auto load(const std::vector<int> &v) { return v; } };
template <typename Ldr, std::size_t ... Is, std::size_t Dim, typename Arg>
auto makeVectorH (std::index_sequence<Is...> const &, Arg(&&arg)[Dim])
{ return Ldr::load({std::forward<Arg>(arg[Is])...}); }
template <typename Ldr, std::size_t Dim, typename Arg>
auto makeVector (Arg(&&arg)[Dim])
{ return makeVectorH<Ldr>(std::make_index_sequence<Dim>{},
std::forward<Arg[Dim]>(arg)); }
int main ()
{
auto v = makeVector<MyLoader>({8, 8, 8});
for (auto x : v)
std::cout << x << "\n";
}