Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4

Шаблоны: определить класс в функции и вызвать его метод

03.08.2015, 23:33. Показов 2870. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте форумчане.

Есть два класса:
C++
1
2
3
4
5
6
class WSelectionBox
{
public:
    WSelectionBox() = default;
    std::set<int> selectedIndexes();
};
C++
1
2
3
4
5
6
class WLineEdit
{
public:
    WLineEdit() = default;
    std::string valueText();
};
Как определить какой именно класс был передан в шаблон и вызвать его метод

C++
1
2
3
4
5
6
7
8
9
10
11
template<typename C>
void save()
{
    Widget* component_ = new C();
    // if WSelectionBox
    if(typeid(C) == typeid(WSelectionBox))
        std::set<int> selection = component_->selectedIndexes();
    // if WLineEdit
    if(typeid(C) == typeid(WLineEdit))
        std::string = component_->valueText();
}
Дабы не возникало такой ошибки?

Code
1
2
'class Wt::WLineEdit' has no member named 'selectedIndexes'
                 std::set<int> selection = component_->selectedIndexes();

С уважением QVO.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.08.2015, 23:33
Ответы с готовыми решениями:

Создать класс Triad (тройка чисел); определить метод сравнения триад. Определить производный класс Date
Создать класс Triad (тройка чисел); определить метод сравнения триад. Определить производный класс Date с полями: год, месяц и день....

Как создать метод и вызвать его
Всем привет. Вопрос заключается в следующем. Только начинаю изучать C# и столкнулся со следующей проблемой (уверен из чистого не знания). У...

Как вызвать метод из одного класса в другой класс
Подскажите пожалуйста как вызвать метод из другого класса: class A { public: B *b; void DrFunc() { ... // как вызвать метод...

24
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
06.08.2015, 04:06  [ТС]
Студворк — интернет-сервис помощи студентам
hoggy, убрал * = nullptr
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template < typename Member,
           typename Model,
           typename std::enable_if< std::is_same< Member, std::string >::value >::type >
void modify_impl()
{
    std::cout << "std::string" << std::endl;
}
 
template < typename Member,
           typename Model,
           typename std::enable_if<std::is_floating_point<Member>::value, Member>::type >
void modify_impl()
{
    std::cout << "floating" << std::endl;
}
 
template < typename Member,
           typename Model,
           typename std::enable_if< std::is_same< Member, int >::value >::type >
void modify_impl()
{
    std::cout << "int" << std::endl;
}
C++
1
2
3
4
        void save()
        {
            modify_impl<FieldType DboModel::*, DboModel>();
        }
Две ошибки:
Code
1
2
3
4
no matching function for call to 'G::Field<G::Game, Wt::Dbo::ptr<G::Genre>, Wt::WComboBox, G::Genre>::modify_impl()'
             modify_impl<FieldType DboModel::*, DboModel>();
                        ^
no matching function for call to 'G::Field<G::Game, Wt::WString, Wt::WTextArea, void>::modify_impl()'
Добавлено через 11 минут
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
template< typename DboModel,
          typename FieldType,
          typename Component,
          typename FieldTypeDboModel = void>
class Field : public FieldInterface
{
    template < typename std::enable_if< std::is_same< FieldType, Wt::Dbo::collection< Dbo::ptr< FieldTypeDboModel > > >::value >::type >
    void modify_impl()
    {
        std::cout << "Wt::Dbo::collection< Dbo::ptr< Model >" << std::endl;
    }
 
    template < typename std::enable_if< std::is_same< FieldType, Wt::Dbo::ptr< FieldTypeDboModel > >::value >::type >
    void modify_impl()
    {
        std::cout << "Wt::Dbo::ptr< Model >" << std::endl;
    }
 
    template < typename std::enable_if< std::is_same< FieldType, Wt::WString >::value >::type >
    void modify_impl()
    {
        std::cout << "Wt::WString>" << std::endl;
    }
 
    template < typename std::enable_if< std::is_same< FieldType, std::string >::value >::type >
    void modify_impl()
    {
        std::cout << "std::string" << std::endl;
    }
 
    template < typename std::enable_if<std::is_floating_point<FieldType>::value, FieldType>::type >
    void modify_impl()
    {
        std::cout << "floating" << std::endl;
    }
 
    template < typename std::enable_if< std::is_same< FieldType, int >::value >::type >
    void modify_impl()
    {
        std::cout << "int" << std::endl;
    }
public:
    Field(G::Auth::Session& session, Dbo::ptr<DboModel> ptr, FieldType DboModel::* member, const WString& title)
        : ptr_(ptr)
        , member_(member)
    {
    }
 
    Field(G::Auth::Session& session, Dbo::collection< Dbo::ptr<DboModel> > ptr, FieldType DboModel::* member, const WString& title)
        : ptr_(ptr)
        , member_(member)
    {
    }
 
    void save()
    {
        modify_impl();
    }
private:
    Dbo::ptr<DboModel> ptr_;
    FieldType DboModel::* member_;
};
Добавлено через 57 секунд
Code
1
2
3
no type named 'type' in 'struct std::enable_if<false, void>'
         void modify_impl()
              ^
Добавлено через 11 минут
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
template< typename DboModel,
          typename FieldType,
          typename Component,
          typename FieldTypeDboModel = void>
class Field : public FieldInterface
{
    template < typename Type = FieldType,
               typename Model = FieldTypeDboModel,
               typename std::enable_if< std::is_same< Type, Wt::Dbo::collection< Dbo::ptr< Model > > >::value >::type >
    void modify_impl()
    {
        std::cout << "Wt::Dbo::collection< Dbo::ptr< Model >" << std::endl;
    }
 
    template < typename Type = FieldType,
               typename Model = FieldTypeDboModel,
               typename std::enable_if< std::is_same< Type, Wt::Dbo::ptr< Model > >::value >::type >
    void modify_impl()
    {
        std::cout << "Wt::Dbo::ptr< Model >" << std::endl;
    }
 
    template < typename Type = FieldType,
               typename Model = FieldTypeDboModel,
               typename std::enable_if< std::is_same< Type, Wt::WString >::value >::type >
    void modify_impl()
    {
        std::cout << "Wt::WString>" << std::endl;
    }
 
    template < typename Type = FieldType,
               typename Model = FieldTypeDboModel,
               typename std::enable_if< std::is_same< Type, std::string >::value >::type >
    void modify_impl()
    {
        std::cout << "std::string" << std::endl;
    }
 
    template < typename Type = FieldType,
               typename Model = FieldTypeDboModel,
               typename std::enable_if<std::is_floating_point< Type >::value, Type>::type >
    void modify_impl()
    {
        std::cout << "floating" << std::endl;
    }
 
    template < typename Type = FieldType,
               typename Model = FieldTypeDboModel,
               typename std::enable_if< std::is_same< Type, int >::value >::type >
    void modify_impl()
    {
        std::cout << "int" << std::endl;
    }
public:
 
    void save()
    {
        modify_impl();
    }
};
Code
1
2
3
4
no matching function for call to 'G::Field<G::Game, Wt::Dbo::ptr<G::Genre>, Wt::WComboBox, G::Genre>::modify_impl()'
             modify_impl();
                         ^
no matching function for call to 'G::Field<G::Game, Wt::WString, Wt::WTextArea, void>::modify_impl()'
Добавлено через 6 минут
в конце
C++
1
typename std::enable_if< ... >::value, Type>::type
добавил
C++
1
* = nullptr
и скомпилировалось.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
14.12.2015, 17:17
hoggy, а есть какая-та альтернатива define в посте Шаблоны: определить класс в функции и вызвать его метод
C++
1
#define dFOR_INTEGRAL\
пытаюсь уйти от них так
C++
1
2
3
4
5
template <typename T>
typedef std::enable_if< property<T>::is_integral>::type* OnlyInteger;
 
template<typename T, typename OnlyInteger = nullptr >
void foo( T&& value )
и что-то никак пока, что
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.12.2015, 19:03
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
есть какая-та альтернатива define в посте
можно вот так:

http://rextester.com/XLWS85710

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
 
template<typename T>struct property
{
    enum { is_integral = std::is_integral<T>::value       };
    enum { is_floating = std::is_floating_point<T>::value };
    enum { is_other = !is_integral && !is_floating        };
};
 
template <typename T>
    using OnlyInteger 
        = typename std::enable_if<property<T>::is_integral>::type* ;
 
template <typename T>
    using OnlyFloating
        = typename std::enable_if<property<T>::is_floating>::type* ;
 
 
template <typename T>
    using Other
        = typename std::enable_if<property<T>::is_other>::type* ;
 
template<typename T, OnlyInteger<T> = nullptr> 
void foo(T&& value)
    { std::cout<<"value = "<< value << " is integral type\n"; }
 
template<typename T, OnlyFloating<T> = nullptr> 
void foo(T&& value)
    { std::cout<<"value = "<< value << " is floating type\n"; }
 
 
template<typename T, Other<T> = nullptr> 
void foo(T&& value)
{
    // расскоментируйте, что бы получить ошибку компиляции
    //static_assert(!property<T>::is_other, "ERROR: T MUST BE INTERGAL OR FLOATING");
        
    std::cout<<"value is other type\n";
}
 
int main()
{
    std::cout << "Hello, world!\n";
    
    foo(10);
    foo(10.5);
    
    foo(nullptr);
}
однако, имхо, что бы упростить конструкцию,
перенасыщенную шаблоно-синтаксисом,
покамест спасают только макросы.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
14.12.2015, 20:18
Цитата Сообщение от hoggy Посмотреть сообщение
спасают только макросы.
а мне почему-то такой вариант больше нравится, вынести шаблонную "подкапотню" в header - и чистенький код, и на такой ноте можно написать много классов.

Еще раз спасибо вам, никак не могу привыкнуть к SFINAE потому, что не могу понять когда его использовать, а когда другие. Сколько кода уже написал и везде справлялся без него, вешь специфиная. Возможно, где-то в моей практике и лучше было бы использовать SFINAE, но как я об этом узнаю если я нашёл в том в время им замену в качестве интерфейса или еще чего.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.12.2015, 20:30
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
не могу понять когда его использовать, а когда другие.
есть мнение, что если можно обойтись без SFINAE, лучше обходится без SFINAE.
потому что техника может сильно усложнить код.
студенты не осилят, а денег на специалиста тратить не хочеццо

одназначно, сфинье не место в коде бизнес-приложения.
такое лучше выносить куда нибудь в библиотеки,
так, что бы потом можно было пользоваться,
не вникая, что там под капотом.

ну а наиболее часто встречающаяся область применения:
метапрограммирование.

когда строения и поведения шаблона-классов-или-функций
зависят от каких то кастомных свойств своих параметров.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.12.2015, 20:30

Возможно ли вызвать метод наследника через указатель на базовый класс
Возможно ли вызвать метод наследника,через указатель на базовый класс, если он не определён как виртуальный или этого метода просто нет в...

Передать метод как параметр и вызвать его
Доброго времени суток. Делаю XNA проект. Создаю игровое меню с кнопками. Меню - это класс, в который передаю список кнопок. В классе Меню...

Абстрактный класс и его наследники - не получается вызвать методы
Есть абстрактный класс, есть классы-наследники, реализующие методы абстрактного класса. В одном классе-наследнике хочу добавить методы...

Как вызвать несколько раз метод после его окончания
Здравствуйте, нужно по нажатию на кнопку вызвать метод к примеру 5 раз. Но вызывать метод повторно нужно только после его окончания. ...

Eсть событие в WindowsForms button1_click и есть класс. Как вызвать метод класса в событии?
необходимо в самом событии баттон клик вызвать то что содержится в отдельном классе


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru