c ++初始化大小为#34; static * int"的char数组。在模板功能

时间:2014-04-10 11:59:08

标签: c++ arrays templates pointers static

是否可以初始化模板函数内的char数组,其大小包含在静态* int?

.header

static int * array_size;

template <class T>
void f(T value)
{
    char buffer[*array_size];
}

或者有没有办法初始化&#34; array_size&#34;以便模板具有使用的默认值?

2 个答案:

答案 0 :(得分:3)

static int * array_size无法正常工作,因为指针内的数据是可修改的,因此无法在编译时确定。

如果您使用的是C ++ 11,我建议

constexpr int array_size = 42;

如果您不能使用C ++ 11,我会使用:

static const int array_size = 42;

在这两种情况下,您都可以像这样创建缓冲区:

char buffer[array_size];

没有星号。

如果在编译时无法找到缓冲区的大小(因此大小取决于运行时决策),则需要使用动态数组,最好封装为std::vector

std::vector<char> bufferVec(myDynamicSize); // Use any integer you want to
char *buffer = &bufferVec[0]; // Use this buffer as a standard array 
                              // with size myDynamicSize OR use the std::vector
                              // directly (much cleaner)

答案 1 :(得分:0)

array_size的Qualifyer必须是常量,否则你将以期望的常量表达式结束。静态关键字无关紧要。

const int array_size = 42;
char buffer[array_size];

即使指针指向const

,指针解除引用也不起作用
const int a = 42;
int const * const array_size = &a;
char buffer[array_size]; // error C2057: expected constant expression

您也可以通过模板参数粘贴array_size:

template <class T, int array_size>
void f(T value)
{
  char buffer[array_size];
}

f<int, 42>(100);