基于c ++大小的运行时类型转换

时间:2011-11-08 21:55:58

标签: c++ templates casting

我正在尝试根据元素的大小恢复数组的类型。我想我不能使用模板。没有switch语句有没有办法实现这个目的?或者如果没有switch语句就不可能,有没有办法将switch语句嵌入到类(caster)中。我喜欢施法者类的想法,因为除了需要类似演员的副本之外还有许多功能。

copy_region(uint8_t *, int);
copy_region(uint16_t *, int);
copy_region(uint32_t *, int);

void copier(uint8_t *ptr_element, int sz_element) {
   copy_region( caster(sz_element, ptr_element), n);
}

我的切换解决方案是这样的:

void copier(uint8_t *ptr_element, int sz_element) {
   switch(sz_element){
     case 1: copy_region( uint8_t*(ptr_element), n); break;
     case 2: copy_region( uint16_t*(ptr_element), n); break;
     case 4: copy_region( uint16_t*(ptr_element), n); break;
   }
}

我还想过将操作定义为仿函数,以便我可以使用单个switch语句,但不同操作的参数非常不同。

编辑:

类型信息不会丢失。我正在尝试使用模板缓冲区实现一个系统(库/框架)。我有一个基于uint8_t作为元素的基本缓冲类。这个类的存在是因为我需要将缓冲区插入到列表中。基本缓冲区类实现对这些缓冲区的操作。 User将缓冲区类型指定为缓冲区类的模板参数,但库只能看到基本缓冲区类和类型信息(元素大小足以推断类型)。

2 个答案:

答案 0 :(得分:4)

template<int sz_element> void copier(uint8_t *ptr_element); //no definition
template<1> void copier(uint8_t *ptr_element)
{copy_region(uint8_t*(ptr_element), n);}
template<2> void copier(uint8_t *ptr_element)
{copy_region(uint16_t*(ptr_element), n);}
template<4> void copier(uint8_t *ptr_element)
{copy_region(uint32_t*(ptr_element), n);}
template<8> void copier(uint8_t *ptr_element)
{copy_region(uint64_t*(ptr_element), n);}

如果在编译时不知道sz_element,则必须使用OP中的开关。

虽然没有任何好处。为什么你有uint8_t*指向任意数据?摆脱它。

[编辑] 你说你有一个底层类是uint8_t的缓冲区,用户将使用类型为info的继承类。在这种情况下,要获得合理的代码,您需要虚函数:

class base {
   vector<uint8_t> buffer;
public:
   virtual void copy()=0;
   virtual ~base() {}
};
template <class type>
class derived : public base {
public:
   virtual void copy() {}
   ~derived() {}
};

这将允许您的库在不知道类型的情况下使用这些函数,但不会丢失任何类型信息。

答案 1 :(得分:2)

我认为您应该重新考虑您的设计,而不是尝试实现您在此处所要做的事情。转到源并在内存块开头的特殊变量中记录数组的类型 - 或者如果可能的话,保持您传递的指针类型作为数组的原始类型,以便您可以强制执行类型安全性更好。

如果你已经从数据中删除了类型信息而没有提供任何机制来提前找出它曾经是什么,那么剩下的选项就不多了。