Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用模板参数填充容器_C++_Templates_C++11_Variadic - Fatal编程技术网

C++ 用模板参数填充容器

C++ 用模板参数填充容器,c++,templates,c++11,variadic,C++,Templates,C++11,Variadic,我想将传递给可变模板的模板参数填充到具有固定长度的数组中。为此,我编写了以下助手函数模板 template<typename ForwardIterator, typename T> void fill(ForwardIterator i) { } template<typename ForwardIterator, typename T, T head, T... tail> void fill(ForwardIterator i) { *i = head;

我想将传递给可变模板的模板参数填充到具有固定长度的数组中。为此,我编写了以下助手函数模板

template<typename ForwardIterator, typename T>
void fill(ForwardIterator i) { }

template<typename ForwardIterator, typename T, T head, T... tail>
void fill(ForwardIterator i) {
  *i = head;
  fill<ForwardIterator, T, tail...>(++i);
}
并编写了以下函数

template<typename T, T... args>
std::array<T, count<T, args...>::value>
params_to_array() {
  std::array<T, count<T, args...>::value> result;
  fill<typename std::array<T, count<T, args...>::value>::iterator,
       T, args...>(result.begin());
  return result;
}
模板
std::数组
参数到数组(){
std::数组结果;
填充(result.begin());
返回结果;
}
现在我和你在一起了

params_to_array<int, 10, 20, 30>()
params_to_数组()

包含内容为
10
20
30
std::array
。还有什么建议吗?

我能看到的在param_to_数组中对terminus进行专门化的唯一原因是这一行:

static const std::size_t SIZE = params_to_array<T, tail...>::SIZE + 1;
static const std::size\u t size=参数到数组::size+1;

由于您的params_to_数组元函数创建了数组,尽管您最终将实例化大小为N,N-1,…,1的数组。因此,我认为您的目标可能需要来自组合和单一责任规则的一些帮助。创建另一个可以对参数列表中的元素进行计数的元函数,并使用它来代替此方法。然后,您至少可以在params_to_数组中消除这种递归。

不需要手动计算参数包中的类型数,这就是
sizeof…
运算符的作用。此外,我将使
fill()
的迭代器类型可推断,无需显式指定它:

template<typename T, typename FwdIt>
void fill(FwdIt it) { }

template<typename T, T head, T... tail, typename FwdIt>
void fill(FwdIt it) {
    *it = head;
    fill<T, tail...>(++it);
}

template<class T, T... args> 
std::array<T, sizeof...(args)> params_to_array() {
    std::array<T, sizeof...(args)> a;
    fill<T, args...>(a.begin());
    return a;
};

你说得对!我修改(并因此简化)了我的程序,它成功了+1.不需要另一个元函数,只需在C++0x中使用
sizeof…(parameterPack)
template<typename T, T... args>
struct count;

template<typename T, T head, T... tail>
struct count<T, head, tail...> {
  static const std::size_t value = count<T, tail...>::value + 1;
};

template<typename T, T last>
stuct count<T, last> {
  static const std::size_t value = 1;
};
template<typename T, T... args>
std::array<T, count<T, args...>::value>
params_to_array() {
  std::array<T, count<T, args...>::value> result;
  fill<typename std::array<T, count<T, args...>::value>::iterator,
       T, args...>(result.begin());
  return result;
}
params_to_array<int, 10, 20, 30>()
static const std::size_t SIZE = params_to_array<T, tail...>::SIZE + 1;
template<typename T, typename FwdIt>
void fill(FwdIt it) { }

template<typename T, T head, T... tail, typename FwdIt>
void fill(FwdIt it) {
    *it = head;
    fill<T, tail...>(++it);
}

template<class T, T... args> 
std::array<T, sizeof...(args)> params_to_array() {
    std::array<T, sizeof...(args)> a;
    fill<T, args...>(a.begin());
    return a;
};
template<class T, T... args> 
std::array<T, sizeof...(args)> params_to_array() {
    std::array<T, sizeof...(args)> a = {{args...}};
    return a;
};