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++ 不允许使用不同类型的对象数组,但有没有办法解决这个问题?我正在考虑以某种方式分离类型信息(诸如指向 Base struct 的指针或 union 的使用之类的提示在我脑海中浮现,但是所有这些我不知道如何存储每个数组元素的类型信息以供在编译期间使用)。可以看到,每个 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永远不会存在允许这样做的原因。

除非您有效地使用 astd::tuple并保证它i是 constexpr。那么你绝对可以用std::get<i>(tup);.

于 2012-10-07T15:39:09.780 回答