15

当我将代码从 C 转换为 C++ 时,有时会遇到 C 语言结构,但与 C++ 兼容。通常我想以最少干扰的方式转换代码。但我有一个案例让我觉得这很困难:

在 C 中,您可以声明一个数组并初始化......嗯......它的一部分使用"designators",其余部分归零(编辑:我首先在这里写了“left to randomness”)

int data[7] = {
    [2] = 7,
    [4] = 9,
};

不过,这不是有效的 C++ 代码(幸运的是)。所以我将不得不使用不同的策略。

虽然我可以在 C++11 中看到一种非侵入式的方式:

static const map<int,int> data = { {2,7}, {4,9} };

当 C++11 功能尚不可用时,我该怎么办?

  • 我可以绕过运行时初始化吗?
  • 有没有办法以“文字”方式初始化类似类型的映射?
  • 什么对使用的代码干扰最小data
4

5 回答 5

11

好吧,除非数组的大小完全疯狂,否则您总是可以这样做

int data[7] = {
    0,
    0,
    7, // #2
    0, 
    9  // #4
    // the rest will be 0-initialized
};

也可以在编译时工作

于 2013-02-27T09:49:06.387 回答
6

如果统一初始化不可用,则std::map<int, int>可以使用以下方法进行初始化boost::assign::map_list_of

#include <boost/assign/list_of.hpp>
static const std::map<int,int> data = boost::assign::map_list_of(2,7)(4,9);
于 2013-02-27T09:10:50.613 回答
3

map<int, int>您可以从 C++11 向后移植(或最小等价物),而不是使用std:arrayBoost.Assign 样式的构建器工具:

#include <cstddef>

template<typename T, size_t N> struct array { T data[N]; };
template<typename T, size_t N> struct build_array: public array<T, N> {
   build_array &operator()(size_t i, const T &t) {
      this->data[i] = t;
      return *this;
   }
};

array<int, 7> data_array = build_array<int, 7>()(2, 7)(4, 9);
int (&data)[7] = data_array.data;
于 2013-02-27T10:09:02.987 回答
1

为什么你不能这样做:

int data[7];
data[2] = 7;
data[4] = 9;

看起来非常非常相似 =)

于 2013-02-27T09:32:49.900 回答
1

如果你不想使用boost::assign 你可以创建它的简单模拟:

template<class T1, class T2>
std::map<T1, T2> cre(std::map<T1, T2> & m)
{
   return std::map<T1, T2>();
}

template<class T1, class T2>
std::map<T1, T2> & ass(std::map<T1, T2> & m, T1 const & p1, T2 const & p2)
{
   m[p1] = p2;
   return m;
}

std::map<int, int> data = ass(ass(cre(data), 2, 3), 7, 6);
于 2013-02-27T10:02:44.527 回答