#include <iostream>
using namespace std;
typedef bool (*fnPkCheck)(void);
template<int N>
struct data {
fnPkCheck checkers[N];
};
template<fnPkCheck ... A>
class packet
{
public:
packet() : m_data {{A...}}
{ }
bool check() {
for (int i = 0; i < sizeof(m_data.checkers) / sizeof(fnPkCheck); i++) {
if (!m_data.checkers[i]())
return false;
}
return true;
}
private:
const data<sizeof...(A)> m_data;
};
bool check1() {
std::cout << __FUNCTION__ << "\n";
return true;
}
bool check2() {
std::cout << __FUNCTION__ << "\n";
return true;
}
bool check3() {
std::cout << __FUNCTION__ << "\n";
return true;
}
int main() {
// your code goes here
packet<check1, check2> c1;
packet<check3, check1, check2, check2, check3> c2;
c1.check();
c2.check();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdHlwZWRlZiBib29sICgqZm5Qa0NoZWNrKSh2b2lkKTsKCnRlbXBsYXRlPGludCBOPgpzdHJ1Y3QgZGF0YSB7CiAgICBmblBrQ2hlY2sgY2hlY2tlcnNbTl07Cn07Cgp0ZW1wbGF0ZTxmblBrQ2hlY2sgLi4uIEE+CmNsYXNzIHBhY2tldAp7CnB1YmxpYzoKICAgIHBhY2tldCgpIDogbV9kYXRhIHt7QS4uLn19CiAgICB7IH0KCiAgICBib29sIGNoZWNrKCkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mKG1fZGF0YS5jaGVja2VycykgLyBzaXplb2YoZm5Qa0NoZWNrKTsgaSsrKSB7CiAgICAgICAgICAgIGlmICghbV9kYXRhLmNoZWNrZXJzW2ldKCkpCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKcHJpdmF0ZToKICAgIGNvbnN0IGRhdGE8c2l6ZW9mLi4uKEEpPiBtX2RhdGE7Cn07Cgpib29sIGNoZWNrMSgpIHsKCXN0ZDo6Y291dCA8PCBfX0ZVTkNUSU9OX18gPDwgIlxuIjsKICAgIHJldHVybiB0cnVlOwp9Cgpib29sIGNoZWNrMigpIHsKCXN0ZDo6Y291dCA8PCBfX0ZVTkNUSU9OX18gPDwgIlxuIjsKICAgIHJldHVybiB0cnVlOwp9Cgpib29sIGNoZWNrMygpIHsKCXN0ZDo6Y291dCA8PCBfX0ZVTkNUSU9OX18gPDwgIlxuIjsKICAgIHJldHVybiB0cnVlOwp9CiAgICAKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCglwYWNrZXQ8Y2hlY2sxLCBjaGVjazI+IGMxOwoJcGFja2V0PGNoZWNrMywgY2hlY2sxLCBjaGVjazIsIGNoZWNrMiwgY2hlY2szPiBjMjsKCWMxLmNoZWNrKCk7CgljMi5jaGVjaygpOwoJcmV0dXJuIDA7Cn0=