Program Listing for File var.hpp¶
↰ Return to documentation for file (include/util/var.hpp)
// SPDX-FileCopyrightText: 2021 Christian Göhring <mostsig@gmail.com>
// SPDX-License-Identifier: MIT
#ifndef THAT_THIS_UTIL_VAR_HEADER_HEADER_FILE_IS_ALREADY_INCLUDED
#define THAT_THIS_UTIL_VAR_HEADER_HEADER_FILE_IS_ALREADY_INCLUDED
#include <utility>
namespace util {
template <typename T>
class var {
public:
explicit var(T&& value) noexcept;
explicit var(const T& value) noexcept;
var() noexcept = default;
~var() = default;
var(var&&) noexcept = default;
var(const var&) noexcept = default;
auto operator=(var&&) noexcept -> var& = default;
auto operator=(const var&) noexcept -> var& = default;
explicit operator T&() noexcept;
explicit operator const T&() const noexcept;
auto get() noexcept -> T&;
auto get() const noexcept -> const T&;
private:
T value_;
};
template <typename T>
var<T>::var(T&& value) noexcept : value_(std::move(value)) {}
template <typename T>
var<T>::var(const T& value) noexcept : value_(value) {}
template <typename T>
var<T>::operator T&() noexcept {
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast) @see Effective C++ by Scott Meyers
return const_cast<T&>(const_cast<const var*>(this)->operator T&());
}
template <typename T>
var<T>::operator const T&() const noexcept {
return value_;
}
template <typename T>
auto var<T>::get() noexcept -> T& {
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast) @see Effective C++ by Scott Meyers
return const_cast<T&>(const_cast<const var*>(this)->get());
}
template <typename T>
auto var<T>::get() const noexcept -> const T& {
return value_;
}
} // namespace util
#endif // THAT_THIS_UTIL_VAR_HEADER_HEADER_FILE_IS_ALREADY_INCLUDED