다형성 객체의 크기를 가져오고 싶습니다. 이다다형성 객체의 크기 가져 오기
struct Base {
virtual std::size_t size() const {
return sizeof(*this);
}
};
struct Derived : Base {
virtual std::size_t size() const {
return sizeof(*this);
}
};
그대로 & 붙여 넣기를 복사 순간 나는이 있어요. 나는 더 잘하고 싶다. 매크로를 정말로 싫어하고 CRTP가 유일한 합리적인 접근 방법 인 것 같습니다. 우리가 한번 시도해 보자
struct SizedBase {
virtual std::size_t size() const = 0;
};
template <typename Type>
struct Sized : virtual SizedBase {
std::size_t size() const override {
return sizeof(Type);
}
};
struct Base : Sized<Base> {};
struct Derived : Base, Sized<Derived> {};
이 훨씬 좋아 보이는,하지만 슬프게도 잘못 형성된다 : Derived
두 최종 overriders Base
에서 size()
에 대한 및 Sized<Derived>
에서이 포함되어 있습니다. 우리는Sized
을 통해 를 상속하여이 문제를 해결 할 수 있습니다
struct SizedBase {
virtual std::size_t size() const = 0;
};
template <typename Type, typename... SizedBases>
struct Sized : virtual SizedBase, SizedBases... {
std::size_t size() const override {
return sizeof(Type);
}
};
struct Base : Sized<Base> {};
struct Derived : Sized<Derived, Base> {};
이 의도 한대로, 그러나 다중 상속의 경우에 다소 혼란 얻고 기지의 접근성/virtualness을 변경 금지 작동합니다.
그럼 더 좋은 방법이 있습니까?
매크로는 여기에서했던 것보다 훨씬 깨끗하고 읽기 쉽습니다 ... – egur
왜 크기가 필요합니까? –
@ n.m. 할당 된 블록의 크기를 저장하지 않고 할당 해제시 명시 적으로 제공해야하는 사용자 정의 메모리 할당자를 위해. 그러나이 문제는 유형 이름 ('type_info :: name()'이 깨진 것처럼) 또는'clone (와 같은 것)과 같은 어떤 다른 다형성 (polymorphic type) 속성 ('typeid'를 통해 얻을 수있는))'복사 생성자를 통해 정의됩니다. –