私はこのようなことをしたい:
template<typename CType, unsigned int targetDimensions> struct GeneratePointerType
{
typedef typename GeneratePointerType<CType, targetDimensions-1>::type* type;
static const unsigned int dimensions = GeneratePointerType<CType, targetDimensions-1>::dimensions+1;
};
template<typename CType> struct GeneratePointerType<CType, 0>
{
typedef CType type;
static const unsigned int dimensions = 0;
};
Dictionary<int, GeneratePointerType<int, valueDimensions>::type >
したがって、基本的には、ポインター型のコンテナー テンプレートをインスタンス化したいのですが、実行前に作成するポインターのポインター レベルがわからないため、上記のアプローチはもちろんコンパイルできません。コンパイル時定数。
意図した動作を実現する方法 (C++11 のみの機能を持たない純粋な C++03 と互換性がある) はありますか?
編集:「本当の問題を教えていただければ、より良い解決策があるかもしれません。」「明確にするために、N 次元の配列/オブジェクトのマップが必要です。ここで、N は実行時の値ですか?奇妙です。ユースケースを想像できません」OK、ユースケースについていくつか説明させてください。
クラス テンプレート ディクショナリがあります。これは基本的に、C# または Java ディクショナリ ジェネリックのように動作します。
このクラスは、C ライブラリの C++ ラッパー ライブラリで使用されます。
そのため、C++ コンテナー クラスのインスタンスと C コンテナー構造体のインスタンスの間でデータを変換する変換関数があります。
ご存知のように、C にはジェネリックがないため、C++ では次のようなコンテナーを作成できます。
Dictionary<int, int**> dict;
CIでは次のようにする必要があります:
CDictionary dic;
dic.keytype = TYPECODE_INT;
dic.valuetype = TYPECODE_INT;
dic.valueDimensions = 2;
C ディクショナリを C++ ディクショナリに変換するとき、C ディクショナリ内に格納されている情報はコンパイル時の定数ではないため、正しい数の * を生成する方法に苦労しています。
EDIT2:実際には、基になるCインターフェイスからランタイムディメンションカウントを取得していることは重要ではありません.Cライブラリは、ネットワーク経由で受信するシリアル化されたデータから構造体を作成し、知ることは不可能であるためです。ライブラリのコンパイル時間、潜在的に別のプログラミング言語の別のアプリからネットワークを介して入ってくる配列の配列次元の数は、デシリアライゼーションの C++ 実装では、ライブラリに関するランタイム情報からディクショナリの値の型を決定する必要があります。配列次元。
EDIT3:「わかりました。この構造をどのように使用したいかを説明する必要があると思います。なぜなら、私は明らかにあなたの質問を正しく解釈しておらず、この情報はどれも質問に含まれていないからです。達成しようとしていますか?」パブリック インターフェイスへの呼び出し:
Dictionary<int, int*> dic;
int* arr = new int[10];
dic.put(1, arr, a0);
delete arr;
send(dic); // dic gets serialized and sent over the netwowork
シリアル化された dic を受け取ったら、コールバックに渡す前に逆シリアル化したい:
// read out typecodes and dimnesions from the serialized data
// [...]
// create the Dictionary from that info
switch(valueTypeCode)
{
case TYPECODE_SHORT:
return new Dictionary<int, GeneratePointerType<short, valueDimensions>::type>[size]();
case TYPECODE_INTEGER:
return new Dictionary<int, GeneratePointerType<int, valueDimensions>::type>[size]();
}
// fill it with the deserialized payload afterwards
// [...]