#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;
}