@yatanai
Поклонник православного С

Как реализовать шаблонный оператор\функцию, чтобы скрыть < и > символы после объявления?

Допустим у нас есть класс вида:
class mem_t
{
public:
    void* ptr;
    size_t size;
    mem_t(void* p, size_t s) : ptr(p), size(s) {}

    template<typename T>
    T& at(size_t n)
    {
        return (T*)ptr[n];
    }
    template<typename T>
    T& operator[](size_t n)
    {
        return (T*)ptr[n];
    }
};

Далее я пишу
int main()
{
    mem_t m(nullptr, 10);

    int a = m.at(5);
    int b = m.at<int>(5);
    int c = m[5];
}


И я хочу добиться того, чтобы int a,c не выдавали ошибок, дабы избежать записи типа int b

Возможно ли это сделать на крестах или нет?

(Почему я не могу написать <> в заголовке? ржу)
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
@yatanai Автор вопроса
Поклонник православного С
В итоге я сам нашёл себе ответ - введение промежуточного класса для кастов в другие типы.

На счёт эффективности его работы я не ручаюсь, но в целом может решить мой вопрос.
Код ниже компилируется в онлайн компиляторах и выводит то что нужно.
#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 - Ржу, компилятор смог это оптимизировать. Победа получается?
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
CTRL+ Москва
от 250 000 до 320 000 ₽
CTRL+ Москва
от 200 000 до 300 000 ₽
CTRL+ Белград
от 250 000 до 320 000 ₽