Boost logo

Boost :

Subject: Re: [boost] [Review] TTI
From: Noah Roberts (roberts.noah_at_[hidden])
Date: 2011-07-27 12:51:33


On 7/26/2011 2:25 PM, Edward Diener wrote:
> On 7/26/2011 5:03 PM, Jeffrey Lee Hellrung, Jr. wrote:
>> On Tue, Jul 26, 2011 at 1:19 PM, Noah
>> Roberts<roberts.noah_at_[hidden]>wrote:
>> [...]
>>
>>> One thing that I think is missing is the option to check for a named
>>> callable within a type. For example, one might want to use enable_if
>>> style
>>> concept checking. So long as a type has function 'xxx' that takes
>>> arguments
>>> of type x,y,and z, and returns something convertible to type A, the
>>> concept
>>> is obeyed. I don't believe this can be done with C++03, but with C++1X I
>>> was able to do something using decltype.
>>>
>> [...]
>>
>> Actually, you can approximate it pretty well in C++03 (using
>> derivation and
>> using tricks) to the point that I think it will work pretty much as you
>> expect except for nullary member functions, where your queries must be
>> more
>> restrictive. This is a useful query, but I believe Edward has decided
>> it to
>> be outside the scope of TTI.
>
> I am not sure what the OP means by 'named callable". If it can be
> introspected within the type I can consider whether it can be done or not.

What I mean by "callable" is that the expression may not be just a
function call but could also be a template instantiation. For example:

Concept C
   z = c.fun(x) | x is an int | result convertible to double

This class obeys:

struct class_a
{
   double fun(int);
};

As does this one:

struct class_b
{
   template < typename T >
   double fun(T);
};

As does this one:

struct class_c
{
   template < typename T >
   converts_to_double_type fun(T);
};

And this:

struct class_d
{
   double fun(has_implicit_int_constructor);
};

etc...

The question being asked here is, can I call something called X within
type T that accepts parameters x,y,z and returns something I can assign
to type A?

Answering this question is often more interesting than the question,
"Does type T have function X with signature Y?" It also cannot be
correctly answered with such a check because it could be implemented by
template, a function that has default arguments, or a function that
takes other types but they are convertible.

I would consider this within the scope of "introspection", but I can see
why it might be omitted for a future version or something.


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