Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
142 / 20 / 2
Регистрация: 07.01.2016
Сообщений: 230
1

Класс сигнала на Variadic Template

12.08.2019, 15:17. Показов 1367. Ответов 3

Добрый день!
Написал класс "сигнала" при помощи variadic templates, но он почему-то не работает:

Сам класс "сигнала":
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
63
64
65
66
#ifndef SIGNAL_H
#define SIGNAL_H
 
// STD
#include <vector>
#include <functional>
 
template <typename ...T>
class Signal
{
public:
    Signal();
 
    size_t addCallback(std::function<void(T...)> callback) const;   // Возвращаем id callback'а
 
    void removeCallback(size_t index) const;                        // Удаление при помощи id быстрее, чем по значению
    void removeCallback(std::function<void(T...)> callback) const;
 
    void emit(T... arguments) const;
 
private:
    mutable std::vector<void(T...)> callbacks;
};
 
template<typename ...T>
inline Signal<T...>::Signal()
{
    callbacks.reserve(5);
}
 
template<typename ...T>
inline size_t Signal<T...>::addCallback(std::function<void(T...)> callback) const
{
    callbacks.push_back(callback);
    return callbacks.size() - 1;
}
 
template<typename ...T>
inline void Signal<T...>::removeCallback(size_t index) const
{
    callbacks.erase(callbacks.begin() + index);
}
 
template<typename ...T>
inline void Signal<T...>::removeCallback(std::function<void(T...)> callback) const
{
    for (size_t i = 0; i < callbacks.size(); i++)
    {
        if (callback == callbacks.at(i)) {
            callbacks.erase(callbacks.begin() + i);
        }
    }
}
 
template<typename ...T>
inline void Signal<T...>::emit(T... arguments) const
{
    for (auto& callback : callbacks)
    {
        if (callback != nullptr) {
            callback(arguments...);
        }
    }
}
 
#endif // !SIGNAL_H
И main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
#include "Signal.h"
 
int main()
{
    Signal<> signal;
    signal.addCallback([]() { cout << "Hello world!" << endl; });
    signal.emit();
 
    return 0;
}
При компиляции выводит ошибку:
Код
Серьезность	Код	Описание	Проект	Файл	Строка	Состояние подавления
Ошибка	C2535	 _Ty (__cdecl *std::allocator<_Ty>::address(_Ty (__cdecl &)) noexcept const): функция-член уже определена или объявлена
        with
        [
            _Ty=void (void)
        ]	Signal	D:\Programs\VisualStudio2019\VC\Tools\MSVC\14.22.27905\include\xmemory	850
Что тут может быть не так?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.08.2019, 15:17
Ответы с готовыми решениями:

Variadic template
Добрый день, господа. Будьте добры, помогите кто может. Есть у меня шаблонный класс ...

С++ 11 Variadic template
не работает, как правильно? template&lt;typename T, typename... ArgTypes&gt; struct...

recursion with variadic template
#define NOT_COMPILE 1 #if NOT_COMPILE // так не компилится template &lt;class Type, unsigned...

Не работает variadic template
привет. код #include &lt;typeinfo&gt; #include &lt;iostream&gt; #include &lt;deque&gt; using namespace std; ...

3
зомбяк
1532 / 1177 / 332
Регистрация: 14.05.2017
Сообщений: 3,822
12.08.2019, 15:54 2
C++
1
mutable std::vector<std::function<void(T...)>> callbacks;
Добавлено через 6 минут
Цитата Сообщение от dpytaylo Посмотреть сообщение
void Signal<T...>::removeCallback(std::function<void(T...)> callback) const
Вот эта тоже коряво написана, т.к. после удаления элемента вектора следующий за ним элемент пропускается.

Добавлено через 58 секунд
(т.к. в момент удаления все элементы хвоста вектора сдвигаются к началу)
1
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,208
12.08.2019, 15:55 3
Лучший ответ Сообщение было отмечено dpytaylo как решение

Решение

Цитата Сообщение от dpytaylo Посмотреть сообщение
mutable std::vector<void(T...)> callbacks;
так ты смотри что именно ты пытаешься в векторе хранить.
функции по значению.


лекарство:

https://rextester.com/NJKD71164

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
#ifndef SIGNAL_H
#define SIGNAL_H
 
// STD
#include <vector>
#include <functional>
 
template <typename ...T>
class Signal
{
    using callback_t = std::function<void(T&&...)>;
public:
    Signal()
        :callbacks()
    { this->callbacks.reserve(5); }
        
 
    template<class Callable>
    size_t addCallback(Callable&& callback)
    {
        this->callbacks.emplace_back(
            std::forward<Callable>(callback)
        );
        return callbacks.size() - 1;
    }
 
    template<class... Args>
    void emit(Args&&... args) const
    {
        for (const auto& callback : this->callbacks)
            if (callback)
                callback(std::forward<Args>(args)...);
    }
 
private:
    std::vector<callback_t> callbacks;
};
 
 
#endif // !SIGNAL_H
 
 
#include <iostream>
 
 
int main()
{
    Signal<> signal;
    signal.addCallback([]() { std::cout << "Hello world!" << std::endl; });
    signal.emit();
}
1
142 / 20 / 2
Регистрация: 07.01.2016
Сообщений: 230
12.08.2019, 16:20  [ТС] 4
TRam_, hoggy, спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.08.2019, 16:20

Variadic template lambda capture
Доброго всем дня! Речь пойдёт об C++14, в котором стало возможным делать прямую передачу в...

Как правильно перебросить аргументы в variadic template?
всем привет, можете помочь пж, есть такая ф-ция: template&lt;typename ... Args&gt; inline wstring...

Variadic Templates - как обращаться к аргументам variadic-функции?
Всем привет! Наверное, рано мне ещё с моими скудными знаниями в это лезть, но, изучив шаблоны и...

Своеобразное раскрытие аргументов variadic template
Товарищи. Как бы сделать так, чтобы variadic раскрылся в нечто такое: template &lt;typename ......

Перенаправление указателя при перегрузке оператора в variadic template
Есть вот такой вот код (сделан в vs2014): #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Variadic templates, или variadic constructor в шаблоне, или прочие извращения
Здравствуйте. Есть такое Wrapper&lt;Obj&gt; w; Wrapper - обертка над объектом того класса, который...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.