TTL::变体,放置新
ttl::variant, placement new
我使用的是"小模板库"中的变体类型。变体定义为:
template< TTL_TPARAMS_DEF(TTL_MAX_TYPELIST_PARAMS, empty_type) >
struct variant
{
typedef variant this_t;
typedef meta::typelist< TTL_ARGS(TTL_MAX_TYPELIST_PARAMS) > list;
...
template< typename T >
variant( const T& r ) : which_(0), pnt_(0)
{
typedef meta::find_equivalent_type<const T&, list> found;
pnt_ = new(stor_.buf_) ttl::data_holder<typename found::type>(r);
which_ = found::index;
}
...
private:
template<int N>
struct storage
{
union
{
ttl::data_holder_base dummy; //hope to satisfy alignment settings
char buf_[N];
};
};
int which_;
ttl::data_holder_base* pnt_;
storage< sizeof(ttl::data_holder<typename list::largest_type>) > stor_;
....
};
struct data_holder_base {};
template< typename T >
struct data_holder : data_holder_base
{
...
typedef const T& param_type;
T d;
...
data_holder( param_type d_ ) : d(d_) {}
...
};
当我通过网络发送这种类型的对象并使用"memcpy"重建"它时,很明显指针"pnt_"将指向涅槃。由于我知道存储的类型,我尝试使用强制转换重建指针"pnt_":
template<typename T>
inline void rebuild()
{
pnt_ = reinterpret_cast<ttl::data_holder<T>*>(stor_.buf_);
}
对于我检查此示例的情况,它有效。但我不知道放置新(pnt_ = new(stor_.buf_) ...
(如何将对象放入stor_.buf_
中。是否需要存储类似std::distance(&stor_.buf_[0], pnt_)
的东西才能找到对象?
还是有没有其他方法可以让pnt_
回来?
谢谢 马里奥
new
将新对象放在stor_.buf_
中,因为这就是放置new
的定义方式。你给new
你希望它使用的内存的地址,它会在该位置构造对象。它返回完全相同的地址,因此存储在pnt_
中的地址是stor_.buf_
的地址,但构造对象的类型是ttl::data_holder<found::type>
,而不是char*
。由于地址相同,因此您提到的std::distance
值将始终为零(假设调用甚至可以编译,但不会编译,因为参数类型不同(。
stor_.buf_
的地址也将始终等于stor_.dummy
的地址。您可以通过分配如下pnt_
来简化添加的代码:
pnt_ = &stor_.dummy;
但是,由于您显然只是在套接字上复制了原始内存,因此修复此variant
对象的内部只是冰山一角。您的变体包含的值也可能包含地址,您无法进入该地址。即使您这样做,您需要的地址也可能不可用。您很幸运variant
您正在修复的地址恰好是同一对象中的地址,因此很容易计算。但是考虑 std::string
,它从免费存储中分配内存;通过套接字发送一个不会给你任何可用的东西在另一端 - 它甚至可能根本不给你字符数据。相反,您应该采用其他一些技术来序列化和反序列化ttl::variant
对象。您可以在Stack Overflow上发布一个问题,询问如何做到这一点。
- std::具有相同基类的类的变体
- 访问者访问变体并返回不同类型时出错
- 我应该使用什么来代替void作为变体中的替代类型之一
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- 如何比较自定义类的std::变体
- 通过网络、跨平台传递std::变体是否安全
- 对于循环变体比较
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 标准::变体的赋值运算符
- 如何@ref同一方法的不同变体?
- 无限嵌套具有变体的地图
- Android Studio:如何在build.gradle中定义自定义宏(针对不同的构建变体),并让原生C / C++
- std::带有前向声明的变体
- 如何将 std::filesystem::p ath 转换为 LPCSTR,以便在 LoadLibrary() 变体之一
- 如何使用可变参数模板强制转换每个变体类型
- 标准::C++中的变体
- 你如何使std::变体的使用更"palatable",语法方面?
- 访问具有单状态的变体
- 确保无变体的型号安全
- TTL::变体,放置新