"Tiny Template Library"의 변형 유형을 사용하고 있습니다. 내가 네트워크를 통해 이러한 유형의 객체를 보내고 "재구성"할 때 그것은 포인터 텟 분명하다 "방어 적이기"을 사용하여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_) {}
...
};
"pnt_"너바나를 가리 킵니다 : 언트는 다음과 같이 정의된다. 나는 그것이 작동이 예제를 확인하는 경우에 대한
template<typename T>
inline void rebuild()
{
pnt_ = reinterpret_cast<ttl::data_holder<T>*>(stor_.buf_);
}
: 때문에 내가 캐스트를 사용하여 포인터 "pnt_"을 다시 시도 저장되어있는 유형을 알고 있다는 사실. 하지만 새로운 배치 (pnt_ = new(stor_.buf_) ...
)가 객체를 stor_.buf_
에 배치하는 방법을 모르겠습니다. 개체를 찾으려면 std::distance(&stor_.buf_[0], pnt_)
과 같은 것을 저장해야합니까?
pnt_
을 다시 얻는 다른 방법이 있습니까?
new
이 일을 어떻게 정의되는지 때문에
추가 포인터에 대한 힌트를 제공해 주셔서 감사합니다. 이것은 내 응용 프로그램에서 문제가되지 않습니다. 네, 더미의 주소를 얻는 것이 더 간단하고 못생긴 캐스트는 필요 없어요. 고마워요! – Mario