有没有办法创建一个用循环初始化的静态const类值?

时间:2017-02-27 16:54:10

标签: c++11 static const static-initialization

静态成员可以声明为const,但必须在声明中初始化。考虑以下用循环中的代码初始化静态数组的情况:

class A {
private:
  enum { SIZE = 360 };
  static double* vertices;
public:
  static void staticInit();
};

double* A::vertices = new double[SIZE];
void A::staticInit() {
  double a = 0, b = 0;
  for (int i = 0; i < SIZE; i++, a += .01, b += .02)
    vertices[i] = sin(a) + c2 * sin(b);
}

上面的代码可行。但如果目的是使顶点保持不变,那么将它声明为const将在staticInit函数上产生编译错误。

在较旧的C ++中,我会声明指针const,并在此函数中将其强制转换为非const,但是今天,编译器不会允许这样做,因为它不安全。当然,不声明指针const更不安全。

有没有干净的出路?

2 个答案:

答案 0 :(得分:3)

创建一个返回makeVertices的{​​{1}}函数,然后通过调用它来初始化std::array值:

static

constexpr std::size_t size = 360; std::array<double, size> makeVertices() { std::array<double, size> vertices; double a = 0, b = 0; for (int i = 0; i < size; i++, a += .01, b += .02) vertices[i] = sin(a) + c2 * sin(b); return vertices; } makeVertices都可以在size内定义。)

A

另请注意,使用class A { private: static std::array<double, size> vertices; }; std::array<double, size> A::vertices = makeVertices(); 代替constexpr来表示编译时数值常量 - 这是惯用的C ++ 11。

答案 1 :(得分:2)

我不明白为什么你不能把你关心的所有const都做成。为了简化用例:

library(tidyverse)
l <- list(dataframe1, dataframe2, dataframe3, dataframe4)
l <- map(l, ~mutate_if(., is.numeric, as.character)
bind_rows(l)

您应该能够将此方案应用于静态类成员。