在派生函数中指定void*参数
Specifying void* parameter in derived function
我想做一些在Cpp中可能不可能做的事情,但我找不到关于这方面的专门帖子。
我想让一个派生类在虚拟函数上指定void*参数的类型。
我有一个名为interface的基类,它带有一个send函数。
// pure virtual
class Interface{
virtual bool Send(const void*)=0;
};
struct Packet{
DataType data;
};
class SpecificInterface{
bool Send(const DataType*);
}
有没有办法让这样的东西发挥作用?其目的是SpecificInterface::Send实现Interface::Send。允许SpecificInterface不是纯虚拟的,同时将void*限制为特定的数据包类型。
否则,我知道我可以取一个void*参数并static_cast将其转换为Packet*类型;但是,我不希望其他人发送无法转换为Packet*的指针类型。
如果不清楚,请告诉我
如果要重写virtual
函数,参数的数量和类型必须与基类中的声明完全匹配。您必须使用:
class SpecificInterface{
bool Send(const void* ptr)
{
cont DataType* dataTypePtr = static_cast<const DataType*>(ptr);
// Now use dataTypePtr any way you wish
}
};
请注意,使用此类代码是危险的。如果ptr
并没有真正指向DataType
对象,那么程序将具有未定义的行为。
@RSahu当然是正确的。你仍然可以使用虚拟方法来做同样的事情:
class Interface {
virtual bool send(const void*) = 0;
};
struct Packet {
DataType data;
};
class SpecificInterface {
bool send(cont void*) override {
send(static_cast<DataType*>(data));
}
bool send(cont DataType*); // code which actually does something
};
然而,我建议反对你的整个方法——这是非常不安全的,因为从来没有检查过类型的有效性!这是许多潜在错误的来源。通常情况下,你可以避免这样做。以下是一些你可以尝试的方法:
std::any
-一个不提供编译时类型安全性,但至少在运行时检查类型的类。您将有一个send(const std::any& data)
虚拟函数,在其中您将调用std::any_cast<DataType>(data)
来获得DataType
或std::any_cast<DataType>(&data)
来获得DataType *
。也许更好——奇怪的重复模板模式(CRTP(:
template <typename T> class Interface { virtual bool send(T*) = 0; }; class SpecificInterface : Interface<DataType> { bool send(cont DataType*) override; }
相关文章:
- 在派生函数中指定void*参数
- void 函数可以传递值参数吗?
- 如何在C++中使用 Void 而不会收到有关参数的错误
- std::function<void()> 接受参数
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- 是否将invoke_result与void参数类型一起使用
- 组合模板参数形成函数签名时无效的 void 参数
- 使用void* 参数定义纯虚函数的抽象基类.派生类匹配参数是指向某种类型的指针
- 为什么 void 参数不能存在于具有多个参数的函数中?
- Pthreads将void*参数强制转换为int数组
- C 函数声明对类型"void(*fcn)(void*)"参数的说明
- 从模拟函数调用中捕获 void* 参数
- 为void参数指定一个模板
- 如何在c++ OCX模块中指定一个接受void*参数的函数
- 某些 GL 函数的好奇"void*"参数
- 如何在C++中为多个对象类型使用void*参数
- 如何使void*参数在函数中保存其局部结果,该函数使用struct *调用
- 在需要void*参数的函数中传递unique_ptr最安全的方法是什么?
- 如何在类/函数模板中传递void参数
- 没有参数和C++中的void参数有什么区别