7

誰かが言う前に、「これは本当に悪いのでやらないでください」.

  1. NUL で終了する文字列を持つ理由を理解しています。
  2. 私は次のようなことを述べることができることを知っています
    char mystr[] = { 'm', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g'};
    ただし、c-string 表現の利便性は大きすぎます。

これの合理的な理由は、私がマイクロコントローラー用にプログラミングしていて、プログラムのメモリにデータを保存する必要があるからです。一部のデータは、バイト、ワード、dword、および float の形式です。NUL のない文字列を連続してデータに含めたいと思います。

<size_t N, char* A><size_t N, char (&A)[N]>をパラメーターとして取り、配列をトラバースしてその内容を静的配列に格納するテンプレートを試しましたが、できませんそれを正しくするようです。私は標準が実際にこれを禁止するかもしれないと思います。

文字列をboost::mpl::vector_c<char, ...>テンプレートのようなものとして再マップできれば、それを適切に格納する他のコードがあるため、テンプレート内から配列を逆参照してconst テンプレート パラメータとして使用することも許可されていないようです。

何か案は?

編集:

疑似コードの例 (実際のコードははるかに大きいため、これはちょっと不自然です。また、このようにバイトごとに読み取ることも、リテラルを使用して文字列の最後まで反復することもありません。それは、データもどこかに。):

// this stores bytes in an array
template<typename X, typename T, T ...numbers>
struct x
{
  static PROGMEM volatile const T data[];
};
template<typename X, typename T, T ...numbers>
PROGMEM volatile const T x<X, T, numbers...>::data[] = { numbers... };

void main()
{
  // this will not work, but the idea is you have byte 0 as 1, 
  // byte 1 as 2 byte 2 as 3 byte 3 as 's', byte 4 as 'o'...
  // byte 22 as 'g', byte 23 as 4, byte 24 as 5, byte 25 as 6.
  typedef x<int, char, 1,2,3,"some embedded string",4,5,6> xx;
  for(i=0; i<20; ++i)
    Serial.print(pgm_read_byte_near(&xx::data[0] + 3));
}

また、私は C++11 を使用していないことに注意してください。これは C++0x であり、おそらく拡張機能です。

4

2 に答える 2