我有以下代码允许我实例化然后调用void()
函数列表。
(如果您希望编译和运行此代码,我正在使用https://github.com/philsquared/Catch进行单元测试)。
#include "catch.hpp"
#include <functional>
#include <vector>
class ChainOfResponsibility : public std::vector<std::function<void()> >, public std::function<void()>
{
public:
void operator()() const
{
for(std::vector<std::function<void()> >::const_iterator it = begin(); it != end(); ++it) {
(*it)();
}
}
};
TEST_CASE("ChainOfResponsibility calls its members when invoked")
{
bool test_function_called = false;
std::function<void()> test_function = [&]()
{
test_function_called = true;
};
ChainOfResponsibility object_under_test;
object_under_test.push_back(test_function);
object_under_test();
REQUIRE(test_function_called);
}
我的问题是如何模板ChainOfResponsibility
类以接受具有不同(但一致)签名的函数?
例如,考虑 aChainOfResponsibility<void(int)>
或 a ChainOfResponsibility<ReturnClass(Argument1Class, Argument2Class)>
。
为了论证,假设第二个示例返回链中最后一个成员返回的值,或者如果链为空,则返回 ReturnClass 的默认值。
此外,如果 STL 已经包含实现此目的的模板类,那么我更愿意使用它而不是我自己开发的类。