I am trying to learn about variadic templates in C++11. I have a class which is basically a wrapper around a std::array. I want to be able to pass function obje
Given the well-known indices infrastructure:
namespace detail
{
template
struct seq { };
template
struct gen_seq : gen_seq { };
template
struct gen_seq<0, Is...> : seq { };
}
You could redefine your class template this way:
template
struct Container {
template
Container(Ts&&... vs) : data{{std::forward(vs)...}} {
static_assert(sizeof...(Ts)==N,"Not enough args supplied!");
}
template
void doOperation(F&& func)
{
doOperation(std::forward(func), detail::gen_seq());
}
template
void doOperation(F&& func, detail::seq)
{
(std::forward(func))(data[Is]...);
}
std::array data;
};
Here is a live example.
Notice, that you do not need to construct an std::function object in main(): the std::function can be implicitly constructed from the lambda. However, you do not even need to use std::function at all here, possibly incurring in an unnecessary run-time overhead.
In the solution above, I just let the type of the callable object to be a template parameter that can be deduced by the compiler.