34 lines
862 B
C++
34 lines
862 B
C++
#pragma once
|
|
#include <cstddef>
|
|
#include <type_traits>
|
|
|
|
namespace larra::xmpp::impl {
|
|
|
|
template <typename T, std::size_t I = 0>
|
|
struct PublicCastTag {
|
|
friend constexpr auto MagicGetPrivateMember(PublicCastTag);
|
|
};
|
|
|
|
template <auto ptr, std::size_t I = 0>
|
|
struct PublicCast {};
|
|
|
|
template <typename T, typename R, R T::*ptr, std::size_t I>
|
|
struct PublicCast<ptr, I> {
|
|
friend constexpr auto MagicGetPrivateMember(PublicCastTag<T, I>) {
|
|
return ptr;
|
|
}
|
|
};
|
|
|
|
template <typename T, typename R, typename... Args, R (T::*ptr)(Args...), std::size_t I>
|
|
struct PublicCast<ptr, I> {
|
|
friend constexpr auto MagicGetPrivateMember(PublicCastTag<T, I>) {
|
|
return ptr;
|
|
}
|
|
};
|
|
|
|
template <typename T, std::size_t I = 0>
|
|
constexpr auto GetPrivateMember(const T&) {
|
|
return MagicGetPrivateMember(PublicCastTag<std::decay_t<T>, I>{});
|
|
};
|
|
|
|
} // namespace larra::xmpp::impl
|