0

Base 構造体から派生した int によってテンプレート化された構造体があります。

struct Base { int i; double d; }; 
template< int N > struct Derv : base { static const int mN = N; };

Derv< N > の配列を作成する必要があります。ここで、N はその配列内の構造体ごとに異なります。C/C++ が異なる型のオブジェクトの配列を許可していないことは知っていますが、これを回避する方法はありますか? どういうわけか型情報を分離することを考えていました (基本構造体へのポインターや共用体の使用のようなヒントが頭に浮かびますが、これらすべてで、コンパイル時に使用するために各配列要素の型情報を格納する方法がわかりません)。ご覧のとおり、各 Derv< N > のメモリ パターンは同じです。

コードの後半でテンプレートを特殊化するために、各配列要素の型にアクセスする必要があります。このすべての一般的な目的は、コード内のどこかで実行時の「型切り替え」を行う必要のないコンパイル時のディスパッチ メカニズムを持つことです。

4

2 に答える 2

1

私はあなたが使うことができると思いますptr = dynamic_cast<Type>(element);..それが間違ったタイプである場合にptr等しいでしょう。NULL例えば:

#include <map>
#include <cmath>
#include <vector>
#include <string>
#include <cstdlib>
#include <fstream>
#include <sstream>
#include <iostream>


using namespace std;

struct Base { int i; double d; Base(){}; virtual ~Base(){};}; 
template< int N > struct Derv : public Base { static const int mN = N; ~Derv(){}; };

int main(int argc, char **argv){
    Base* arr[2];
    arr[0] = new Derv<10>;
    arr[1] = new Derv<5>;
    Derv<10> *ptr = dynamic_cast<Derv<10>* >(arr[0]);
    Derv<5> *ptr2 = dynamic_cast<Derv<5>* >(arr[0]);
    cout << ptr << endl << ptr2 << endl;
    return 0;
}
// That should print 
0x9571008 //ptr to object will differ every time.
0 // Null because of wrong type.

ただし、これを機能させるには、構造体に仮想デストラクタや仮想関数を定義する必要があります。

于 2012-10-07T15:38:27.507 に答える
1

それは間違いなく不可能です。あなたがした場合

int i;
std::cin >> i;
some_magic_array X[size];

では、どのようなタイプX[i]ですか?ああ、待って、あなたはおそらく知ることができません。これはC++固有のものではなく、基本的に不可能です。そのため、some_magic_arrayこれを許可するものは存在しません。

を効果的に使用し、それがconstexprstd::tupleであることを保証しない限り。i次に、絶対にこれを行うことができますstd::get<i>(tup);

于 2012-10-07T15:39:09.780 に答える