我想知道是否有可能使以下answer更通用,因为数组的类型是模板化的而不是仅仅是无符号的:
我把整个事情都包含在这样的结构中:
template<typename ArrayType>
struct Array
{
template<ArrayType... args> struct ArrayHolder {
static const ArrayType data[sizeof...(args)];
};
template<ArrayType... args>
const ArrayType ArrayHolder<args...>::data[sizeof...(args)] = { args... };
template<size_t N, template<size_t> class F, ArrayType... args>
struct generate_array_impl {
typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result;
};
template<template<size_t> class F, ArrayType... args>
struct generate_array_impl<0, F, args...> {
typedef ArrayHolder<F<0>::value, args...> result;
};
template<size_t N, template<size_t> class F>
struct generate_array {
typedef typename generate_array_impl<N-1, F>::result result;
};
};
但我收到以下错误:
c++-4.6 -std=c++0x -o test test.cpp
test.cpp:49:17: error: specializing member ‘Array<ArrayType>::ArrayHolder<args>::data’ requires ‘template<>’ syntax
答案 0 :(得分:8)
如果缩进结构,它会有所帮助。问题是您在Array结构中定义数据静态成员变量。但它应该在命名空间范围内:
template<typename ArrayType>
struct Array
{
template<ArrayType... args> struct ArrayHolder {
static const ArrayType data[sizeof...(args)];
};
template<size_t N, template<size_t> class F, ArrayType... args>
struct generate_array_impl {
typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result;
};
template<template<size_t> class F, ArrayType... args>
struct generate_array_impl<0, F, args...> {
typedef ArrayHolder<F<0>::value, args...> result;
};
template<size_t N, template<size_t> class F>
struct generate_array {
typedef typename generate_array_impl<N-1, F>::result result;
};
};
template<typename ArrayType> template<ArrayType... args>
const ArrayType Array<ArrayType>::ArrayHolder<args...>::data[sizeof...(args)] = { args... };
答案 1 :(得分:-2)
呃...你为什么不用std :: vector?或者如果你想要一个不可靠的数组,那么在boost中使用等效类型?
答案 2 :(得分:-2)
我不认为像'template'这样的表达式是C ++ 11可变参数模板的有效用法。
根据我的理解,它可以有两种形式:
template <typename... args>
:可变数量的泛型类型参数template <int... args>
:可变数量的整数(非类型)参数有关可变参数模板,请参阅this wikipedia article。