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
| #include <iostream>
#include <vector>
#include <functional>
using namespace std;
template<typename T>
class Signal;
template<typename R, typename... Args>
class Signal<R(Args...)>
{
typedef function<R(Args...)> F;
public:
template<class T>
void Connect(T&& Callback)
{
MyCallbacks.push_back(Callback);
}
vector<R> operator()(Args&&... args) const
{
vector<R> results;
for(F const& f : MyCallbacks)
results.push_back(f(std::forward<Args>(args)...));
return results;
}
private:
vector<F> MyCallbacks;
};
template<typename... Args>
class Signal<void(Args...)>
{
typedef function<void(Args...)> F;
public:
template<class R>
void Connect(R&& Callback)
{
MyCallbacks.push_back(Callback);
}
void operator()(Args&&... args) const
{
for(F const& f : MyCallbacks)
f(std::forward<Args>(args)...);
}
private:
vector<F> MyCallbacks;
};
void DisplayString(std::string const& str)
{
std::cout << "Displayed: " << str << std::endl;
}
int main()
{
Signal<void (std::string const&)> Out;
Out.Connect(DisplayString);
Out("Bonjour tout le monde !");
return 0;
} |
Partager