
----- Original Message ----- From: "Yechezkel Mett" <ymett.on.boost@gmail.com> To: <boost@lists.boost.org> Sent: Wednesday, November 19, 2008 11:02 AM Subject: Re: [boost] task_array<n> and variadic templates
On Wed, Nov 19, 2008 at 3:18 AM, vicente.botet <vicente.botet@wanadoo.fr>wrote:
Hi,
I want to create an static task_array<n> which must be initiaized with n functors.
In pseudo code:
template <std::size N> struct task_array { template <typename F_1, ..., typename F_N> task_array(F_1 f1, ..., F_N fN); };
You could use a normal variadic template constructor with a static_assert in it.
Ok, I see. template <std::size N> struct task_array { template <typename... F> task_array(F... f) { static_assert(sizeof...(T) == N, "Constructor must provide N parameters"); }; I can use Boost.StaticAssert or Boost.Mpl for that.
If that's not good enough (i.e. you need to remove the constructor from the overload set) I would suggest enable_if, but I can't think of a way to get it into the constructor. With concepts you could do
requires std::True<sizeof...(T) == N>
This is really coul template <std::size N> struct task_array { template <typename... F> task_array(F... f) requires std::True<sizeof...(T) == N>; }; Comming back to my example, I need to store the tasks on an array. I do it now like this: template <> struct task_array<3> { task arr_[3]; template <typename F_1, typename F_2, typename F_3> task_array(F_1 f1, F_2 f2, F_3 f3) { arr_[0]=task(f1); arr_[1]=task(f2); arr_[2]=task(f3); } }; I don't see a simple way to do it with variadic templates other than recursion. Is there a simple way to achieve this something like template <std::size N> struct task_array { task arr_[N]; template <typename... F> task_array(F... f) { static_assert(sizeof...(T) == N, "Constructor must provide N parameters") { arr_={task(f)...}; } }; Thanks, Vicente