В итоге я сам нашёл себе ответ - введение промежуточного класса для кастов в другие типы.
На счёт эффективности его работы я не ручаюсь, но в целом может решить мой вопрос.
Код ниже компилируется в онлайн компиляторах и выводит то что нужно.
#include <iostream>
using namespace std;
class foo
{
public:
void* ptr;
int n;
template<class T>
operator T()
{
T* x = static_cast<T*>(this->ptr);
T z = x[this->n] ;
return z;
}
};
class mem_t
{
public:
void* ptr;
size_t size;
mem_t(void* p, size_t s) : ptr(p), size(s) {}
foo at(size_t n)
{
foo ret;
ret.ptr = this->ptr;
ret.n = n;
return ret;
}
};
int main()
{
cout<<"5 is : ";
auto num = new int[10];
num[5] = 3;// Проверяем вывод
mem_t m ((void*)num, 10u);
int a = m.at(5);
std::cout << a << endl;
return 0;
}
//5 is : 3
Может можно сделать так что бы компилятор справлялся "оптимизируя" такое, но там нужно более углублённые знания в то как работают ссылки\переменные в крестах, чего у меня нет.
PS - Код не вылизанный, я просто писал что бы работало
PSS - Ржу, компилятор смог это оптимизировать. Победа получается?