mirror of
https://github.com/cuberite/cuberite.git
synced 2025-01-07 03:16:55 +08:00
Stop cFunctionRef constructor from disabling default copy constructor. (#4173)
* Stop cFunctionRef constructor from disabling default copy constructor. + cFunctionRef: Improve documentation
This commit is contained in:
parent
31a11a6df4
commit
b5f29d5d2c
2
Doxyfile
2
Doxyfile
@ -194,7 +194,7 @@ SEPARATE_MEMBER_PAGES = NO
|
|||||||
# The TAB_SIZE tag can be used to set the number of spaces in a tab.
|
# The TAB_SIZE tag can be used to set the number of spaces in a tab.
|
||||||
# Doxygen uses this value to replace tabs by spaces in code fragments.
|
# Doxygen uses this value to replace tabs by spaces in code fragments.
|
||||||
|
|
||||||
TAB_SIZE = 2
|
TAB_SIZE = 4
|
||||||
|
|
||||||
# This tag can be used to specify a number of aliases that acts
|
# This tag can be used to specify a number of aliases that acts
|
||||||
# as commands in the documentation. An alias has the form "name=value".
|
# as commands in the documentation. An alias has the form "name=value".
|
||||||
|
@ -6,17 +6,42 @@ template <class Signature>
|
|||||||
class cFunctionRef;
|
class cFunctionRef;
|
||||||
|
|
||||||
/** A light-weight, type-erased reference to a function object.
|
/** A light-weight, type-erased reference to a function object.
|
||||||
This is similar to a std::function but doesn't copy the function object
|
|
||||||
which means that mutable function objects will be modified for the caller
|
### Usage
|
||||||
but would not be if using a std::function (See #3990 for implications of this).
|
|
||||||
A cFunctionRef has no empty state but is non-owning and so is safe to call
|
`cFunctionRef` is used whenever you call a normal function with a lambda. e.g.
|
||||||
as long as the referred object is still alive. */
|
one of the `cWorld::DoWith` functions,
|
||||||
|
|
||||||
|
m_World->DoWithChunkAt(BlockPos, [](cChunk & a_Chunk) -> bool
|
||||||
|
{
|
||||||
|
...
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
It looks like you're calling it with a lambda but that would require
|
||||||
|
`DoWithChunkAt` to be a template. The function is really being called with
|
||||||
|
`cFunctionRef<bool(cChunk&)>` which is constructed from the lambda via a
|
||||||
|
templated constructor. This gives you a generic pointer to the lambda which
|
||||||
|
doesn't depend on the type of the function object it references.
|
||||||
|
|
||||||
|
### Notes
|
||||||
|
|
||||||
|
- This is similar to a `std::function` but doesn't copy the function object.
|
||||||
|
This means that mutable function objects will be modified for the caller but
|
||||||
|
would not be if using a `std::function` (See #3990 for implications of this).
|
||||||
|
|
||||||
|
- A `cFunctionRef` has no empty state but is non-owning and so is safe to call as
|
||||||
|
long as the referred object is still alive. */
|
||||||
template <class Ret, class... Args>
|
template <class Ret, class... Args>
|
||||||
class cFunctionRef<Ret(Args...)>
|
class cFunctionRef<Ret(Args...)>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/** Construct from a function object. */
|
/** Construct from a function object. */
|
||||||
template <class FunctionObject>
|
template <class FunctionObject,
|
||||||
|
typename std::enable_if< // Don't disable the default copy constructor
|
||||||
|
!std::is_same<typename std::decay<FunctionObject>::type, cFunctionRef>::value,
|
||||||
|
int>::type = 0
|
||||||
|
>
|
||||||
cFunctionRef(FunctionObject && a_FunctionObject)
|
cFunctionRef(FunctionObject && a_FunctionObject)
|
||||||
{
|
{
|
||||||
// Store an opaque reference to the object.
|
// Store an opaque reference to the object.
|
||||||
|
Loading…
Reference in New Issue
Block a user