Boost logo

Boost :

Subject: Re: [boost] task_array<n> and variadic templates
From: Vicente Botet (vicente.botet_at_[hidden])
Date: 2008-11-19 10:08:41


----- Original Message -----
From: "Yechezkel Mett" <ymett.on.boost_at_[hidden]>
To: <boost_at_[hidden]>
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_at_[hidden]>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


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk