Boost logo

Boost :

Subject: Re: [boost] [mpl] has_function
From: Lorenzo Caminiti (lorcaminiti_at_[hidden])
Date: 2010-03-27 20:56:54


On Mon, Mar 22, 2010 at 9:12 AM, Ingo Loehken <Ingo.Loehken_at_[hidden]> wrote:
> below you find the appropiate code, that checks if a set of functions is
> declared for a type T,
> where the declaration should be inherited from nsISupports (or any other
> interface). So you'd
> can determine, if the function is overloaded or not.

It turned out that I only needed to check if a struct is declared
within one of the base classes or not. This seems simpler that my
original goal for has_function and I was able to adapt Ingo's code to
get the job done -- see below. However, I am getting the following
compiler error:

$ g++ -Wall -Werror test/noinherit/05.cpp
test/noinherit/05.cpp: In instantiation of ‘const bool
z::has_contract_f_<x>::value’:
test/noinherit/05.cpp:34: instantiated from here
test/noinherit/05.cpp:31: error: the default argument for parameter 1
of ‘static char z::has_contract_f_<T>::check(C*, typename
C::contract_f_<0>*) [with C = x, T = x]’ has not yet been parsed

Do you know how I can get around this error?

// File test/noinherit/05.cpp

#include <iostream>

struct x {
    virtual void f() {}
    template<int Z> struct contract_f_ {};
};

struct y {
    void g() {}
    template<int Z> struct contract_g_ {};
};

struct z: x, y {
    void f() {}
    template<int Z> struct contract_f_ {};

    template<typename T>
    struct has_contract_f_ {
    private:
        typedef char true_t;
        struct false_t { true_t dummy[2]; };
        static T* make();

        static false_t check(...);
        template<typename C> static true_t check(C*,
                typename C::template contract_f_<0>* = 0);
    public:
        static const bool value =
                sizeof(check(make())) == sizeof(true_t); // line 31
    };

    static const bool bx = has_contract_f_<x>::value; // line 34
    static const bool by = has_contract_f_<y>::value;
};

int main() {
    std::cout << z::bx << std::endl;
    std::cout << z::by << std::endl;
    return 0;
}

If has_contract_f_ is declared outside struct z than there is no error
-- the code compiles and works. However, I need has_contract_f_ to be
a member struct of z, because of the way I use it within my library,
and that generates the compiler error reported above.

Thanks a lot.
Lorenzo


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