문제

나는 단순화하려고 노력하고있다 ( make_fn()) 매개 변수를 전처리하는 함수 생성 ( wrap()) Arity의 회원 기능 N.
functors를 생성하는 것은 기본적으로 작동하지만 지금까지는 멤버 함수의 매개 변수 유형을 명시 적으로 지정하여 만 작동합니다.
이제 처리하는 멤버 함수 유형에서 올바른 functor를 생성하고 싶습니다.

struct X {};

template<class C, typename T1, bool (C::*F)(T1)>
inline // there are more for T1..TN
bool wrap(C* c, X x) 
{
    return (c->*F)(process<T1>(x));
}

template<class C, typename T1, bool (C::*F)(T1)> 
inline // there are more for T1..TN
boost::function<bool (C*, X)> make_fn(F f) // <- problem here, F is not a type
{
    return boost::bind(&wrap<C, T1, F>, _1, _2);
}

그러나 VC ++ 및 G ++는 보이지 않습니다. F 매개 변수의 유형으로 make_fn(). 나는 여기서 명백한 것을 놓쳐야하고 다소 눈이 멀어진다.

아이디어는 다음과 같이 작동해야한다는 것입니다.

struct A 
{
    bool f1(bool) { return true; }
};

void test()
{
    A a;
    X x;
    make_fn(&A::f1)(&a, x);
}

그 일을하는 방법에 대한 아이디어가 있습니까?

배경:
단순화 될 때 다음과 같이 보이는 고정 된 인터페이스가 있습니다.

bool invoke(C* c, const char* const functionName, int argCount, X* args);

x는 특정 백엔드 유형 (int, std :: string, ...)으로 변환 해야하는 변형 유형입니다.
이러한 통화를 처리하기 위해 이름으로 찾아보고 unfunctors의 맵이 있습니다.
포장의 의도는 수동 변환을 피하고 대신 나에게 변환을 수행하는 기능을 생성하는 것입니다. throw. 매크로 기반 솔루션으로 작동하고 있지만 해당 솔루션은 유형과 매개 변수 수를 명시 적으로 지정해야합니다.
함수 과부하 해상도를 통해 멤버 함수 서명에서 올바른 변환 unftor를 암시 적으로 생성하고자합니다.

도움이 되었습니까?

해결책

당신이 함수를 유형이 아닌 템플릿 인수로 전달하려고 시도하는 것처럼 보입니다.

당신이 할 수있는 것은 함수 포인터를 함수 객체에 저장하는 것입니다. 다음은 컴파일하는 것으로 보입니다.

#include <boost/bind.hpp>
#include <boost/function.hpp>

struct X {};

template <class T>
bool process(X) { return true; }


template <class C, class T1, class Func>
struct wrap1
{
    typedef bool result_type;
    Func f;

    wrap1(Func f): f(f) {}

    bool operator()(C* c, X x)
    {
        return (c->*f)(process<T1>(x));
    }
};

template<class C, typename T1>
inline // there are more for T1..TN
boost::function<bool (C*, X)> make_fn(bool (C::*f)(T1))
{
    return boost::bind(wrap1<C, T1, bool (C::*)(T1)>(f), _1, _2);
}


struct A
{
    bool f1(bool) { return true; }
};

void test()
{
    A a;
    X x;
    make_fn(&A::f1)(&a, x);
}

그러나 그것이 좋은지 확실하지 않으며 나머지 포장지를 어떻게 만들 것인지 잘 모르겠습니다. 후자의 경우 변수 템플릿을 지원하는 컴파일러를 얻을 수 있습니다. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top