Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
21 / 17 / 5
Регистрация: 05.09.2020
Сообщений: 167

Возврат типа исходя из метода класса

18.10.2020, 16:49. Показов 1591. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс:
C++
1
2
3
4
5
6
7
8
9
10
11
template<typename type>
class P {
    ...
    uint64_t x = 252352; //Просто адрес переменной...
 
    operator type() {
        if (x)
        return *(type*)x;
        //Если type класс, то вернуть int значение...
    }
};
Можно как-то обойтись без typeinfo, таких функций как bool get(A &a) и т.п. и не менять тип объекта с класса на int...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.10.2020, 16:49
Ответы с готовыми решениями:

Возврат объекта шаблонного типа от типа Type из специализации шаблона метода от того же типа
Доброго времени суток, пишу класс содержащий несколько std::set от разных типов, нужно сделать метод возвращающий указатель на нужное...

возврат копии обьекта класса из метода
Привет всем. Есть класс ниже в нём operator+. Помогите компилятор выдаёт ворнинг warning C4172: returning address of local variable or...

Как вызвать из одного класса (для метода типа void) метод типа boolean другого класса?
ребят, только учусь и конечно, вопросов возникает много. ситуация вот в чем. есть массив. я должна найти в i-том элементе какую-то...

8
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
18.10.2020, 17:07
macced, вообще говоря - ничего не понятно.

Пока что с дословной интерпретацией того, что вы написали, получается так:

Цитата Сообщение от macced Посмотреть сообщение
Если type класс, то вернуть int значение...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <type_traits>
 
template<typename type>
class P {
 
    uint64_t x = 252352; //Просто адрес переменной...
    
public:
    // Если type класс, то вернуть int значение...
    operator std::enable_if_t<std::is_class<type>::value, int>() const {
        return *(int*)x;
    }
    operator type() const {
        // возможно остальные случаи    
    }
};
Если вы на самом деле имели в виду что-то другое, то наверное стоит это уточнить.
1
21 / 17 / 5
Регистрация: 05.09.2020
Сообщений: 167
19.10.2020, 02:33  [ТС]
DrOffset, Идея кажется в правильном направлении, но:
Не работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <type_traits>
 
using namespace std;
 
template<typename type>
class A {
public:
    operator enable_if<is_class<type>::value, int>() const {
        return 66;
    }
 
    operator type() const {
        return 55;
    }
};
 
class X {
 
};
 
int main() {
    A<X> a;
    cout << a;
}
Так работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <type_traits>
 
using namespace std;
 
template<typename type>
class A {
public:
    operator enable_if<is_class<type>::value, int>() const {
        return 66;
    }
 
    operator int() const { //Благодаря этому - работает.
        return 55;
    }
};
 
class X {
 
};
 
int main() {
    A<X> a;
    cout << a;
}
Добавлено через 9 минут
Кажется это решило бы мою проблему (нашел на cppreference), но что-то идет не так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <type_traits>
 
using namespace std;
 
class X;
 
template<typename type>
class A {
public:
    operator std::conditional<is_class<type>::value, int, type>::type() {
        return 66;
    }
};
 
class X {
 
};
 
int main() {
    A<X> a;
    cout << a;
}
  1. std::conditional<std::is_class<_Ty>::val ue,int,double>::type: зависимое имя не является типом
  2. "operator полное имя" не является распознаваемым оператором или типом
  3. синтаксическая ошибка: newline
  4. непредвиденные лексемы перед "{"; пропуск вероятного тела функции

Добавлено через 13 минут
Через функцию, нормально получаю тип переменной:
C++
1
2
3
4
5
6
7
8
template<typename Type>
class A {
public:
    ...
    void get() {
        cout << typeid(std::conditional<is_class<Type>::value, int, Type>::type).name();
    }
};
0
21 / 17 / 5
Регистрация: 05.09.2020
Сообщений: 167
19.10.2020, 11:51  [ТС]
Проблема решена так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<typename type>
class P {
    const char* test = "test";
    uint64_t x = (uint64_t)&test;
public:
    operator typename std::conditional<std::is_class<type>::value, uint64_t, type>::type() {
        return *(typename std::conditional<std::is_class<type>::value, uint64_t, type>::type*)x;
    }
};
 
class X {
 
};
 
int main() {
    P<X> p1;
    cout << p1 << endl;
    P<char*> p2;
    cout << p2 << endl;
}
Выход:7ff6f1fbac10
test
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
19.10.2020, 20:52
Цитата Сообщение от macced Посмотреть сообщение
Идея кажется в правильном направлении, но:
Не работает:
Идея не просто в верном направлении, а в совершенно верном. Особенно если вы код скопируете правильно.
Повнимательнее посмотрите на мой код:
Цитата Сообщение от DrOffset Посмотреть сообщение
C++
1
operator std::enable_if_t<std::is_class<type>::value, int>() const {
и на ваш
Цитата Сообщение от macced Посмотреть сообщение
C++
1
operator enable_if<is_class<type>::value, int>() const {
найдете отличия?

Код работает, онлайн пример в доказательство: https://rextester.com/BHLP27312
0
21 / 17 / 5
Регистрация: 05.09.2020
Сообщений: 167
19.10.2020, 21:34  [ТС]
DrOffset, Это я уже искал решение исправления ошибок, по этому без _t. Да, так код работает, но если раскомментировать и попробовать скормить шаблону тип переменной, то начнут сыпаться ошибки, если решение в описании других типов, то пропадает смысл в этом, а вот мой вариант, именно то, что мне нужно было. Класс возвращает uint64_t, иначе передает тип из шаблона.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<typename type>
class P {
    const char* test = "test";
    uint64_t x = (uint64_t)&test;
public:
    operator auto() {
        return *(typename std::conditional<std::is_class<type>::value, uint64_t, type>::type*)x;
    }
};
 
class X {
 
};
 
int main() {
    P<X> p1;
    cout << p1 << endl;
    P<char*> p2;
    cout << p2 << endl;
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
19.10.2020, 21:46
Цитата Сообщение от macced Посмотреть сообщение
но если раскомментировать и попробовать скормить шаблону тип переменной, то начнут сыпаться ошибки
Разумеется. Так и должно быть. Код был недописан, потому что вопрос был недоформулирован.

Цитата Сообщение от macced Посмотреть сообщение
а вот мой вариант, именно то, что мне нужно было
Я, между тем, пытался узнать у вас что именно вам нужно, но вы почему-то игнорируете подобные вопросы. Так что увы.
Было бы проще, если бы вот это
Цитата Сообщение от macced Посмотреть сообщение
Класс возвращает uint64_t, иначе передает тип из шаблона.
Вы написали в первом сообщении.
Так как это наверняка не последний ваш вопрос здесь, то прошу обратить на это внимание, чтобы не тратить зря свое время и время других участников.
1
21 / 17 / 5
Регистрация: 05.09.2020
Сообщений: 167
19.10.2020, 21:52  [ТС]
Я посмотрел на это и подумал, что меня правильно поняли...
C++
1
2
3
operator type() const {
    // возможно остальные случаи    
}
В любом случае спасибо, благодаря этому, нашел то, что именно мне нужно.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
19.10.2020, 22:19
macced,
По теме, исходя из наконец полученного ответа. Например, в стиле С++17:
C++
1
2
3
4
5
6
7
    
    operator auto() const {
        if constexpr( std::is_class<type>::value )
            return 66;
        else 
            return type();
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.10.2020, 22:19
Помогаю со студенческими работами здесь

Как передать входящее значение одного метода класса на возврат в другой метод того же класса?
Я самый новейший новичок. Помогите.Как передать входящее значение (количество еды) метода feed класса Cat на возврат(return) в метод...

Работа метода класса в зависимости от типа объекта класса
есть такой код: template &lt;typename __Type, size_t __m&gt; class mvector { private: __Type _m; ...

Обработка метода класса в зависимости от типа данного класса
Имеется класс родителя A с методом Update(), этот класс имеет 2 дочерних класса B, C, каждый из них имеет свой метод обработки Update:...

Извлечение типа метода класса
Привет. Может кто заморачивался с подобным. Какую шаблонную магию можно использовать, чтоб метод класса представить в виде, который можно...

Явная специализация метода для типа шаблонного класса
Добрый вечер, уважаемые знатоки! :) Хочу задать вопрос по созданию шаблонов. В общем, пусть у меня есть шаблон некоторого класса: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru