15

コードを C から C++ に変換すると、C であるが C++ と互換性のある言語構造に遭遇することがあります。通常、コードを最も邪魔にならない方法で変換したいと考えています。しかし、それが非常に難しいと感じるケースが 1 つあります。

Cでは、配列を宣言して初期化することができます...まあ... 「指定子」を使用してその一部、残りはゼロにされます(編集:最初に「左にランダムに」と書きました)

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

を使用する代わりに、C++11 からmap<int, int>バックポート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;
于 2013-02-27T10:09:02.987 に答える
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 に答える
1

できない理由:

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

非常によく似ています =)

于 2013-02-27T09:32:49.900 に答える