将指向模板类调用的指针强制转换为同一模板的不同调用是否安全

is it safe to cast a pointer to a template class invocation to a different invocation of the same template?

本文关键字:调用 安全 是否 转换 指针      更新时间:2023-10-16

这里的动机是建立一个函数库,这些函数在对数据一无所知的情况下对数据进行操作。 在下面的示例中,test_me调用具有实际数据类型 (INT) 的小组件模板。 并派生一个作用于传递的数据的小部件。 然后将它们传递给库例程,该例程将数据指针传递给虚拟 ACT 方法。

template <class T>
class widget
{
public:
  widget() {}
  virtual ~widget() {}
  virtual void act( T *p ) = 0;
};
class int_widget : public widget<int>
{
public:
  int_widget() : widget() {}
  virtual ~int_widget() {}
  virtual void act( int *p ) {
    printf( "*p=%dn", *p );
  }
};
void pass_to( void *data, widget<void> *wvp )
{
  wvp->act( data );
}
void test_me()
{
  // we want to pass 42 to an int_widget...
  int i = 42;
  int_widget iw;
  // is this a safe way to do it?
  pass_to( (void *) &i, (widget<void> *) &iw );
}

显然,库的使用者有责任确保所有小部件都能正确解释它们给出的数据。

如果编译器以完全相同的方式为小部件的各种调用布置 vtables,则此方法有效。 并且没有问题投射指向实际数据的指针。

问题是:除了上述情况之外,我是否错过了任何其他条件?出于所有实际目的,上述假设是否有效?

不,

这是不安全的。不同的模板实例化是根本不同的类型。

通过 void* 从一种此类类型转换为另一种类型是未定义的行为。