2014-12-01 1 views
0

템플릿을 사용하여 클래스와 같은 형질을 만들고 싶습니다. 한 가지 해결책은 이 부분적으로 멤버 함수를 특수화 한 다음 함수 포인터를 사용하여이를 참조하는 것입니다. 이param에 기반한 템플릿 화 된 멤버 함수 포인터 반환

enum M{ 
    X, 
    Y 
}; 

class A { 
    //member vars 
    M m; 

    //member funcns 
    template<> foo<X> (int, int); 
    template<> foo<Y> (int, int); 

    typedef double (A::*xy)(int,int); 
    xy goo; 

    void init(){ 
     goo = CHOOSE(m); 
    } 



xy SELECT (M p){ 
switch(p){ 
case X: 
    return foo<X> 
} 



} 

지금 나는 m에 따라, (끈적 거리는에 값을 할당이 필요한 foo는 오티 지적하고자처럼

그래서 내가 가지고있는 것은 현재 보인다.하지만 쓰는 것도 구문 오류이라고합니다. 선택 함수를 작성하는 방법에 어떤 도움 나는 그것의 서명을 의미, 어떻게 대응 templatised 기능을

+0

['std :: function'] (http://en.cppreference.com/w/cpp/utility/functional/function) 및 ['std :: bind'] (http : //en.cppreference.com/w/cpp/utility/functional/bind). –

+0

XY 문제는 아마도? 실제 문제는 무엇을 해결하려고합니까? –

+0

아, 실제로 * 전체 오류를 포함하여 하나 또는 두 번의 시도가 표시 될 수도 있습니다. –

답변

0

를 반환하는 내가 생성자의 선택 로직 포함 :.

#include <iostream> 

enum M { X, Y }; 

class A 
{ 
    M m; 

    template <M> double foo(int, int); 

    typedef double (A::*xy)(int,int); 
    xy goo; 
public: 
    A(M x); 

    double doit(int x, int y) 
    { 
    return (this->*goo)(x, y); 
    } 
}; 

template <> double A::foo<X>(int x, int y) { return x + y; } 
template <> double A::foo<Y>(int x, int y) { return x * y; } 

A::A(M x) 
: m(x) 
{ 
    if (m == X) 
    { 
    goo = &A::foo<X>; 
    } 
    else if (m == Y) 
    { 
    goo = &A::foo<Y>; 
    } 
    else 
    { 
    throw 666; // or whatever 
    } 

} 

int main() 
{ 
    A a(X); 
    A b(Y); 

    std::cout << a.doit(7, 8) << std::endl; 
    std::cout << b.doit(7, 8) << std::endl; 
} 

이 프로그램은 예상대로 15와 56을 인쇄합니다.

+0

정확히 내가 선택한 디자인이 아니기 때문에 내가 실제로 찾고 있던 것이 아닙니다. 그러나 이것은 서명과 반환 유형을 얻는 것을 도왔습니다. 그래서 이것을 받아 들여라. 감사 – ssj3892414