Boost logo

Boost :

From: Marco Costalba (mcostalba_at_[hidden])
Date: 2007-10-08 01:39:22


On 10/8/07, Joel de Guzman <joel_at_[hidden]> wrote:
> There's no way to detect the signature
> of a template function (the operator()):
>

Perhaps you don't need this. You only need to check if the template
function operator() matches one signature in the Signatures set.

I have found this nice (and very small) code from Paul Mensonides that
seems to works (at least for me)

http://www.mail-archive.com/boost@lists.boost.org/msg00164.html

The limitation is that you have to specify the type of the function,
but in our case is not a problem because we have a finite set called
'Signatures' among which to choose the operator() type.

As you can see from his testing example:

truct X {
    void operator()(void) {
        return;
    }
};

struct Y { };

struct Z {
    template<class T> T operator()(T v) const {
        return v;
    }
};

int main(void) {
    std::cout
        << has_function_call<void (X::*)(void)>::value << '\n'
        << has_function_call<void (Y::*)(void)>::value << '\n'
        << has_function_call<int (Z::*)(int) const>::value << '\n';
    return 0;
}

It is possible to check against any operator() given that you now the
signatures you are looking for. Now the challange is, given a function
obect of class F, to forge a way to loop across Signatures, that are
function signatures,

void (void)
void (void)
int (int) const

transform in the corresponding member signatures of class F

void (F::*)(void)
void (F::*)(void)
int (F::*)(int) const

And check each one with has_function_call() until a match is found or
return an error otherwise.

Easier to say then to do ;-)

Marco


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