template<
typename T>
class utils::Box< T >
Remote storage for a single item. Implemented as a unique pointer that is never null
, except when moved from.
Has the semantics of non-optional T
. Copies the content on copy, compares by the contained value.
Use in the following cases:
- to create recursive types while maintaining value semantics;
- to hide the implementation of a class in cpp;
- to prevent the large size or alignment of a field from inflating the size or alignment of an object.
Use utils::UniqueRef instead:
- to add a non-movable field to a movable object;
- to own an object of a polymorphic base class.
Usage example:
struct RecursionStarterPack {
std::string structs;
std::string strings;
};
struct PackSection {
std::string box;
std::optional<RecursionStarterPack> here_we_go_again;
};
TEST(UtilsBox, Sample) {
PackSection pack{
"box",
{{
"structs",
"strings",
"box",
std::nullopt,
}},
}},
};
auto another_pack = pack;
EXPECT_EQ(another_pack, pack);
another_pack.here_we_go_again->structs = "modified structs";
EXPECT_NE(another_pack, pack);
EXPECT_EQ(pack.here_we_go_again->structs, "structs");
}
Definition at line 54 of file box.hpp.
|
| Box () |
| Allocate a default-constructed value.
|
|
template<typename U = T, std::enable_if_t< impl::ConjunctionWithTrait< impl::kArgsAreNotSelf< Box, U >, std::is_convertible, U &&, T >(), int > = 0> |
| Box (U &&arg) |
| Allocate a T , copying or moving arg.
|
|
template<typename... Args, std::enable_if_t< impl::ConjunctionWithTrait< impl::kArgsAreNotSelf< Box, Args... >, std::is_constructible, T, Args &&... >(), int > = 0> |
| Box (Args &&... args) |
| Allocate the value, emplacing it with the given args.
|
|
| Box (Box &&other) noexcept=default |
|
Box & | operator= (Box &&other) noexcept=default |
|
| Box (const Box &other) |
|
Box & | operator= (const Box &other) |
|
template<typename U = T, std::enable_if_t< impl::ConjunctionWithTrait< impl::ConjunctionWithTrait< impl::kArgsAreNotSelf< Box, U >, std::is_constructible, T, U >(), std::is_assignable, T &, U >(), int > = 0> |
Box & | operator= (U &&other) |
| Assigns-through to the contained value.
|
|
| operator bool () const =delete |
|
T * | operator-> () noexcept |
|
const T * | operator-> () const noexcept |
|
T & | operator* () noexcept |
|
const T & | operator* () const noexcept |
|
bool | operator== (const Box &other) const |
|
bool | operator!= (const Box &other) const |
|
bool | operator< (const Box &other) const |
|
bool | operator> (const Box &other) const |
|
bool | operator<= (const Box &other) const |
|
bool | operator>= (const Box &other) const |
|