将指向模板类调用的指针强制转换为同一模板的不同调用是否安全
is it safe to cast a pointer to a template class invocation to a different invocation of the same template?
这里的动机是建立一个函数库,这些函数在对数据一无所知的情况下对数据进行操作。 在下面的示例中,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* 从一种此类类型转换为另一种类型是未定义的行为。
相关文章:
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 线程调用的函数对对象删除是否安全?
- 由并发无序映射查找线程调用的函数是否安全?
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 同时调用 ASIO 对象的 API 是否安全?
- 对于琐碎的对象,在"this"上调用新放置是否安全?
- 使用范围解析运算符时,在构造函数中调用虚拟方法是否安全?
- 混合延迟 dll 加载和手动调用 LoadLibraryA 是否安全?
- 从 WindowsAPI 调用 NetLocalGroupAddMembers 时,安全 ID 结构无效错误
- 在移出向量上调用 size() 方法是否安全?
- 将整数添加到数组值而无需调用它的最安全方法
- 在 c++ 中,所有 system() 调用都存在安全风险吗?
- 调用不访问已删除对象中的任何类成员的类方法是否安全
- 从不同线程调用mpi_init是安全的吗?
- 静态初始化不安全调用的线程安全
- 在Visual C 中找到调用函数地址(安全)
- 从 std::d eque 线程对 emplace_back() 和运算符 []() 的并发调用是否安全?
- Openssl 线程安全回调函数注册,包括直接调用和间接调用
- 对于C++基类来说,存储"this"的值以供构造后的未来虚拟调用安全吗?
- c++系统调用安全问题