#include <cstdint>
#include <array>
#include <memory>
#include <utility>
template <typename kernel_type, typename... kernel_types>
class MyObsKernel
{
public:
MyObsKernel(typename std::tuple_element<0, std::tuple<kernel_types...>>::type, kernel_type, int, int) {}
};
template <typename kernel_type, typename... kernel_types>
class MyKernel { public: MyKernel(int , int ) {} };
template <typename kernel_type, typename ... kernel_types>
class MetaKernel : public MyKernel<kernel_type, kernel_types...> {
public:
MetaKernel (unsigned int m, unsigned int n, const kernel_type& kernel_, const kernel_types&... kernels_) :
MyKernel<kernel_type, kernel_types...>(m, n),
Ks({std::unique_ptr<MyObsKernel<kernel_type, kernel_types...> >(new MyObsKernel<kernel_type, kernel_types...>(kernels_, kernel_, m, n))...})
{
}
private:
std::array<std::unique_ptr< MyObsKernel<kernel_type, kernel_types...>>, sizeof...(kernel_types)> Ks;
};
int main()
{
MetaKernel<int, char, char> m(42, 42, 42, '*', '*');
return 0;
}
I2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxhcnJheT4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHV0aWxpdHk+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUga2VybmVsX3R5cGUsIHR5cGVuYW1lLi4uIGtlcm5lbF90eXBlcz4KY2xhc3MgTXlPYnNLZXJuZWwKewpwdWJsaWM6CiAgICBNeU9ic0tlcm5lbCh0eXBlbmFtZSBzdGQ6OnR1cGxlX2VsZW1lbnQ8MCwgc3RkOjp0dXBsZTxrZXJuZWxfdHlwZXMuLi4+Pjo6dHlwZSwga2VybmVsX3R5cGUsIGludCwgaW50KSB7fQp9Owp0ZW1wbGF0ZSA8dHlwZW5hbWUga2VybmVsX3R5cGUsIHR5cGVuYW1lLi4uIGtlcm5lbF90eXBlcz4KY2xhc3MgTXlLZXJuZWwgeyBwdWJsaWM6IE15S2VybmVsKGludCAsIGludCApIHt9IH07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUga2VybmVsX3R5cGUsIHR5cGVuYW1lIC4uLiBrZXJuZWxfdHlwZXM+CmNsYXNzIE1ldGFLZXJuZWwgOiBwdWJsaWMgTXlLZXJuZWw8a2VybmVsX3R5cGUsIGtlcm5lbF90eXBlcy4uLj4gewpwdWJsaWM6CgogICAgTWV0YUtlcm5lbCAodW5zaWduZWQgaW50IG0sIHVuc2lnbmVkIGludCBuLCBjb25zdCBrZXJuZWxfdHlwZSYga2VybmVsXywgY29uc3Qga2VybmVsX3R5cGVzJi4uLiBrZXJuZWxzXykgOgogICAgICAgIE15S2VybmVsPGtlcm5lbF90eXBlLCBrZXJuZWxfdHlwZXMuLi4+KG0sIG4pLAogICAgICAgIEtzKHtzdGQ6OnVuaXF1ZV9wdHI8TXlPYnNLZXJuZWw8a2VybmVsX3R5cGUsIGtlcm5lbF90eXBlcy4uLj4gPihuZXcgTXlPYnNLZXJuZWw8a2VybmVsX3R5cGUsIGtlcm5lbF90eXBlcy4uLj4oa2VybmVsc18sIGtlcm5lbF8sIG0sIG4pKS4uLn0pCiAgICB7CiAgICB9CnByaXZhdGU6CiAgICBzdGQ6OmFycmF5PHN0ZDo6dW5pcXVlX3B0cjwgTXlPYnNLZXJuZWw8a2VybmVsX3R5cGUsIGtlcm5lbF90eXBlcy4uLj4+LCBzaXplb2YuLi4oa2VybmVsX3R5cGVzKT4gS3M7Cn07CgppbnQgbWFpbigpCnsKICAgIE1ldGFLZXJuZWw8aW50LCBjaGFyLCBjaGFyPiBtKDQyLCA0MiwgNDIsICcqJywgJyonKTsKICAgIHJldHVybiAwOwp9Cg==