誰かが言う前に、「これは本当に悪いのでやらないでください」.
- NUL で終了する文字列を持つ理由を理解しています。
- 私は次のようなことを述べることができることを知っています
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 であり、おそらく拡張機能です。