所以gcc 4.9.0
有implemented a static_assert
离子这个类型不是void
要正确符合标准。这对于标准一致性来说很好。std :: unique_ptr <void>不被gcc所接受4.9.0
我有一个变种类型,存储在std::unique_ptr<void>
现在不起作用的数据。简单的解决方法是将其更改为std::shared_ptr<void>
,并立即编译。更好的解决办法是提供删除函子。
以下是修复unique_ptr
的安全方法吗?这会显示未定义的行为与某些多态类型?
#include <memory>
#include <iostream>
template<typename T>
void Deleter(void * p) {
delete reinterpret_cast<T*>(p);
}
int main() {
const std::unique_ptr<void, void(*)(void*)> v(new int(199), Deleter<int>);
std::cout << *reinterpret_cast<int*>(v.get()) << std::endl;
return 0;
}
那岂不是更容易(从长远来看,反正)和比较安全[Boost variant](http://www.boost.org/doc/libs/1_55_0/doc/html/variant.html)或[Boost any](http://www.boost.org/doc/libs/1_55_0) /doc/html/any.html)? –
为什么不使用适当的变体类型(如[boost :: variant'](http://www.boost.org/doc/libs/release/doc/html/variant.html)或您自己的实现)?应尽可能少地使用'void *'。 –
我有我自己的变体类型,这就是我已经实现的。我通常会使用增强变体,但我的变体需要可序列化。从'MurmurHash3'派生的类型标识号和序列化函数被删除。这使得我的当前用例所需的变量可以跨过进程/设备进行编组。 –