$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] [Tick] Universal quantified concepts/traits
From: Vicente J. Botet Escriba (vicente.botet_at_[hidden])
Date: 2014-12-17 18:07:58
Le 17/12/14 07:20, Vicente J. Botet Escriba a écrit :
> Le 16/12/14 22:53, paul Fultz a écrit :
>> Ok, I think I understand what you are aksing for. This how I would 
>> approach
>> the problem using Tick. It does require defining different traits to get
>> there(I am not sure how it could be done all in one take). First, I 
>> would
>> define `is_callable` that checks if a function is called with `T` and 
>> returns
>> `U`:
>>
>>      TICK_TRAIT(is_callable)
>>      {
>>          template<class F, class T, class U>
>>          auto requires_(F&& f, T&& t, U&&) -> tick::valid<
>> decltype(returns<U>(f(std::forward<T>(t))))
>>          >;
>>      };
>>
>> Next I would write a trait that checks if the two types, `Wt` and 
>> `Wu`, are
>> mapped like `W<T> -> W<U>` and that the function takes `T` and 
>> returns `U`:
>>
>>      template<class Wt, class Wu, class F>
>>      struct is_mapped
>>      : std::false_type
>>      {};
>>
>>      template<template<class...> class W, class T, class U, class F>
>>      struct is_mapped<W<T>, W<U>, F>
>>      : is_callable<F, T, U>
>>      {};
>>
>> And then I would write the `is_functor` to call the `map` function 
>> and check
>> that it returns a mapped type:
>>
>>      TICK_TRAIT(is_functor)
>>      {
>>          template<class F, class Wt>
>>          auto requires_(F&& f, Wt&& wt) -> tick::valid<
>>              decltype(returns<is_mapped<Wt, _, F>(
>>                  map(f, std::forward<Wt>(wt))
>>              ))
>>          >;
>>      };
>>
>> Does that make sense? Is this what you are asking for?
>>
>>
> No, this trait has two parameters F and Wt. I'm looking for a trait 
> with a single parameter W, the type constructor. Maybe I'm looking for 
> a thing that should not exists ;-)
>
This SO question presents the same context.
HTH,
Vicente