Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
1

Как построить шаблонную функцию?

10.04.2015, 17:22. Показов 1140. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер!
Есть код, который всегда повторяется в дочерних классах:
C++ (Qt)
1
2
3
QPushButton *button = new QPushButton(QIcon(":/icons/" + icon + ".png"), title, this);
connect(button, &QPushButton::clicked, this, callback);
button->setFixedWidth(width);
где
Code
1
2
3
4
icon - строка
title - строка
width - int число
callback - ссылка на функцию (например &SomeClass::method)
Вопрос: как этот код затолкнуть в метод базового класса, если этот самый базовый класс является шаблонным, и как ему узнать название дочернего класса SomeClass, чтобы скомпилировалась строка connect...?


PS хоть код из Qt - вопрос не по Qt.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.04.2015, 17:22
Ответы с готовыми решениями:

Как правильно написать шаблонную функцию?
Как правильно написать функцию template ? в функции main не работает #include "stdafx.h" #include <iostream> using...

Как прописать шаблонную функцию внутри шаблонного класса?
Как объявить шаблонную функцию/*типа iterator*/ внутри шаблонного класса?

Как использовать шаблонную функцию в другой единице трансляции?
Как исправить ошибку? Спрашиваем у однокурсников и никто не знает(( file1.cpp export template<typename T> T twice(T...

1
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,680
10.04.2015, 20:31 2
Лучший ответ Сообщение было отмечено [progeR] как решение

Решение

[progeR], Честно говоря, не уверен, что шаблоны здесь лучшее решение.
Но вот тебе 1 вариант:
Кликните здесь для просмотра всего текста
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
template <typename T>
class BaseClass
{
public:
 
protected:
    template <typename DT>
    typename std::enable_if<std::is_base_of<BaseClass, DT>::value, void>::type
        createButton(void (DT::*method)(int))
    {
        QPushButton *button = new QPushButton(QIcon(":/icons/" + icon + ".png"), title, this);
        connect(button, &QPushButton::clicked, static_cast<DT *>(this), method);
        button->setFixedWidth(width);
    }
};
 
class SomeClass
    : public BaseClass<int>
{
public:
    void create()
    {
        createButton(&SomeClass::method);
    }
 
private:
    void method(int)
    { }
};

Можно также воспользоваться идиомой CRTP. Тогда код будет выглядеть как-то так:
Кликните здесь для просмотра всего текста
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
template <typename T, typename DT>
class BaseClass
{
public:
 
protected:
    void createButton(void (DT::*method)(int))
    {
        QPushButton *button = new QPushButton(QIcon(":/icons/" + icon + ".png"), title, this);
        connect(button, &QPushButton::clicked, static_cast<DT *>(this), method);
        button->setFixedWidth(width);
    }
};
 
class SomeClass
    : public BaseClass<int, SomeClass>
{
public:
    void create()
    {
        createButton(&SomeClass::method);
    }
 
private:
    void method(int)
    { }
};

Или не использовать шабоны вообще, тогда код преобразуется в такой:
Кликните здесь для просмотра всего текста
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
template <typename T>
class BaseClass
{
public:
    //....
 
protected slots:
    virtual void method(int)
    {}
 
protected:
    void createButton()
    {
        QPushButton *button = new QPushButton(QIcon(":/icons/" + icon + ".png"), title, this);
        connect(button, &QPushButton::clicked, this, &BaseClass::method);
        button->setFixedWidth(width);
    }
};
 
class SomeClass
    : public BaseClass<int>
{
public:
    void create()
    {
        createButton();
    }
 
private:
    /*virtual*/void method(int)
    { }
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.04.2015, 20:31
Помогаю со студенческими работами здесь

Как вернуть экземпляр класса через шаблонную функцию
Вот программа, два класса и функция main #pragma once class BaseClass { public: BaseClass(); ~BaseClass();

Шаблоны, древовидная сортировка: как правильно передавать тип в шаблонную функцию?
Реализую собственную версию древовидной сортировки на основе шаблонов. Нужно сравнение производить по объект функции. Тип шаблона -...

Написать шаблонную функцию, принимающую три параметра и возвращающую их среднее арифметическое как float
Функция f6, которая принимает три аргумента определенного типа (int, double или/ char) и возвращает среднее арифметическое типа float....

Передача указателя на шаблонную функцию в другую функцию
Пишу тест для нескольких улучшений квиксорта с измерением времени. Функция benchmark принимает итераторы для диапазона элементов, указатель...

Написать шаблонную функцию
Здравстсвуйте,нужно переделать функцию под шаблонную.Я вроде как сделал,но компилятор ругается.Работаю в Rad Xe2. Вот код #pragma...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Что нового в C# 14
UnmanagedCoder 10.03.2025
Предстоящая версия C# 14 обещает принести изменения, которые сделают разработку еще более приятной и эффективной. Что стоит отметить, так это влияние сообщества разработчиков на формирование новых. . .
Формулы поворота
Igor3D 10.03.2025
Добрый день Тема Эти формулы приводятся во множестве тьюториалов, часто под видом "матрица вращения на плоскости". x' = x * cos(a) - y * sin(a) y' = y * cos(a) + x * sin(a) Как бы Вы их. . .
Что нового в .NET 10
UnmanagedCoder 10.03.2025
. NET 10 выходит как релиз с длительной поддержкой (LTS), включающей три года обновлений. В этом обновлении Microsoft сфокусировались на нескольких направлениях: производительность, оптимизация. . .
Отложенное высвобождение, RCU и Hazard Pointer в C++26
NullReferenced 09.03.2025
Многопоточное программирование стало важной частью современной разработки. Когда несколько потоков одновременно работают с общими данными, возникает целый ряд проблем, связанных с синхронизацией и. . .
Неблокирующийся стек на C++26
NullReferenced 09.03.2025
Традиционные способы синхронизации в многопоточном программировании — мьютексы, семафоры, условные переменные — часто превращаются в узкое место в плане производительности. При этом неблокирующиеся. . .
Обработка строк в C++26: Новые возможности string и string_view
NullReferenced 09.03.2025
Новый стандарт C++26 предлагает много улучшений для работы с привычными string и относительно новыми string_view. string_view - это невладеющая ссылка на последовательность символов, появившаяся в. . .
Мой первый аддон для Blender 3D, с помощью нейронки (не зная даже азов пайтона, но это не значит что так и с остальным).
Hrethgir 09.03.2025
Потратил весь день. Пол-дня мне хватило, чтобы понять что с версией с 14B мне не одолеть написание функционального кода, на языке с которым я вообще никак не знаком - пайтон. Версия 22B от другого. . .
Einstein@Home сегодня исполняется двадцать лет!
Programma_Boinc 09.03.2025
Einstein@Home сегодня исполняется двадцать лет! Отправлено 19 февраля 2025 года в 17:20:21 UTC Я хочу поздравить всех наших волонтеров, разработчиков и ученых из Einstein@Home. Мы официально. . .
Заполнители и расширенный набор символов в C++26
NullReferenced 09.03.2025
C++26 представляет два важных обновления: заполнители и расширенный набор символов. Заполнители (placeholders) решают давнюю проблему лаконичности кода в шаблонных выражениях и лямбда-функциях. Они. . .
Контракты в C++26
NullReferenced 09.03.2025
Контракты – это механизм, позволяющий указывать предусловия, постусловия и инварианты для функций в коде. Эта функциональность должна была стать частью C++20, но была исключена на встрече комитета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru