本质上是利用变长模板解决参数个数的问题。
#pragma once
#include <utility>
#include <memory>
#include <vector>
#include <functional>
template <typename T>
class Creater
{
public:
Creater() : iT(nullptr) {}
~Creater() = default;
template<typename... Args>
void createT(Args&&... args)
{
iT = new T(std::forward<Args>(args)...);
}
private:
std::unique_ptr<T> iT;
};
template <typename... Args>
class CallbackHolders
{
public:
CallbackHolders() = default;
~CallbackHolders() = default;
void addCallback(std::function<void(Args...)> aCallback)
{
iCallbacks.push_back(aCallback);
}
template<typename... Args>
void invoke(Args&&... args)
{
for (auto& callback : iCallbacks)
{
callback(std::forward<Args>(args)...);
}
}
private:
std::vector<std::function<void(Args...)>> iCallbacks;
};
int main()
{
CallbackHolders<int, int> holders;
holders.addCallback([](int a, int b)->void {std::cout << "a + b = " << a + b << std::endl;
});
holders.invoke(3, 4);
CallbackHolders<std::string> holders1;
holders1.addCallback([](std::string a)->void {std::cout << a << std::endl; });
holders1.invoke("aaa");
return 0;
}