@yatanai

Как определить тип функции для шаблона?

Балуюсь с крестами, пробую писать свойства для своих библиотек.
Писал код с мыслью что бы оно генерировало минимум лишних данных, чем страдали "велосипедные реализации" на лямбда выражениях. За ночь вышло что-то такое. Но есть вопрос...
template<class C>
class property : public C
{
public:
    property& operator= (decltype(C::n) arg)
    {
        this->Setter(arg);
        return *this;
    }
    operator decltype(C::n)()
    {
        return this->Getter();
    }
};
class Test 
{
protected:
    int Getter()
    {
        std::cout << ("GET\n");
        return n;
    }
    void Setter(int arg)
    {
        std::cout << ("SET\n");
        n = arg;
    }
    int n;
};
int main()
{
    property<Test> x;
    x = 10;
    std::cout << "Hello World! << "<< x << "\n";
}

Как убрать "int n"? Исходя из дальнейшей идеи я думал что можно взять тип из функции геттера, но при написании "decltype(С::Getter)" и подобных компилятор ругался что так делать нельзя.
А как мне избавится от грёбаннного "int n"???
(Мимо 3:30 "ночи")
  • Вопрос задан
  • 121 просмотр
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Можно использовать typedef int value_type; в классе с Setter/Getter.

Тогда в вашем шаблоне вы можете использовать C::value_type. Так в STL, например, сделано.

Плюсы: не надо обязательно заводить n. Можно обзывать его как удобнее или оно может вообще иметь другой тип, если свойство хранится неявно.

Минусы: Надо обязательно заводить этот самый value_type и обновлять его вместе с методами Getter/Setter.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
alex1951
@alex1951
"умных преподавателей слушал я невнимательно..."
Коль речь идет о шаблонах и желательно избавиться от int, не лучше ли воспользоваться шаблоном?
template <class T, template <typename> class mc>
class property : public mc<T> {
public:
    property& operator= (T arg)  {
        this->Setter(arg);
        return *this;
    }
    operator T() {
        return this->Getter();
    }
};

template<class T>
class Test {
protected:
    T Getter() {
        std::cout << ("GET\n");
        return n;
    }
    void Setter(T arg) {
        std::cout << ("SET\n");
        n = arg;
    }
    T n;
};

int main() {
    property<int, Test> x;
    x = 10;
    std::cout << "Hello World! << "<< x << "\n";
    
    property<float, Test> y;
    y = 5.3f;
    std::cout << "Hello World! << "<< y << "\n";
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы