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