当我将代码从C转换为C ++时,我有时会遇到C语言构造,但与C ++兼容。通常我想以最少侵入性的方式转换代码。但我有一个案例,我发现这很困难:
在C中,你可以使用“指示符”声明一个数组并初始化 ...好...... 部分 ,其余部分归零(编辑:我在这里写了“留给随机性”,第一部分):
int data[7] = {
[2] = 7,
[4] = 9,
};
这不是有效的C ++代码(幸运的是)。所以我将不得不使用不同的策略。
虽然我可以在C ++ 11中看到一种非侵入性的方式:
static const map<int,int> data = { {2,7}, {4,9} };
当C ++ 11功能尚不可用时,我该怎么办?
data
的代码的最少侵入性是什么?答案 0 :(得分:11)
除非阵列的大小完全是疯了,否则你总能做到这一点
int data[7] = {
0,
0,
7, // #2
0,
9 // #4
// the rest will be 0-initialized
};
也适用于编译时
答案 1 :(得分:6)
如果无法进行统一初始化,则可以使用boost::assign::map_list_of
初始化std::map<int, int>
:
#include <boost/assign/list_of.hpp>
static const std::map<int,int> data = boost::assign::map_list_of(2,7)(4,9);
答案 2 :(得分:3)
而不是使用map<int, int>
,您可以从C ++ 11向后移植std:array
(或最小等价物),并使用Boost.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;
答案 3 :(得分:1)
你为什么不能这样做:
int data[7];
data[2] = 7;
data[4] = 9;
看起来非常相似=)
答案 4 :(得分: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);