41 lines
1.1 KiB
C++
41 lines
1.1 KiB
C++
|
#pragma once
|
||
|
|
||
|
#include <memory>
|
||
|
|
||
|
// ReferenceWrapper was created because std::reference_wrapper
|
||
|
// wasn't copyable
|
||
|
// Implementation has been taken from:
|
||
|
// http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper
|
||
|
// TODO: once the c++ implementation will have proper implementation
|
||
|
// this class should be deleted and replaced with std::reference_wrapper
|
||
|
|
||
|
template <class T>
|
||
|
class ReferenceWrapper
|
||
|
{
|
||
|
public:
|
||
|
// types
|
||
|
typedef T type;
|
||
|
|
||
|
// construct/copy/destroy
|
||
|
ReferenceWrapper(T &ref) noexcept : _ptr(std::addressof(ref)) {}
|
||
|
ReferenceWrapper(T &&) = delete;
|
||
|
ReferenceWrapper(const ReferenceWrapper &) noexcept = default;
|
||
|
|
||
|
// assignment
|
||
|
ReferenceWrapper &operator=(const ReferenceWrapper &x) noexcept = default;
|
||
|
|
||
|
// access
|
||
|
operator T &() const noexcept { return *_ptr; }
|
||
|
T &get() const noexcept { return *_ptr; }
|
||
|
|
||
|
// template <class... ArgTypes>
|
||
|
// typename std::result_of<T &(ArgTypes &&...)>::type
|
||
|
// operator()(ArgTypes &&... args) const
|
||
|
// {
|
||
|
// return std::invoke(get(), std::forward<ArgTypes>(args)...);
|
||
|
// }
|
||
|
|
||
|
private:
|
||
|
T *_ptr;
|
||
|
};
|