2014-09-19 2 views
1

사소한 코드 내부에서 일부 클래스 메소드를 호출하는 함수를 인스턴스화해야한다고 가정합니다.const 한정자 변경으로 메소드 대체 (C++)

#include <iostream> 

class A 
{ 
public: 
    int f() { return 1; } 
    int g() { return 2; } 
}; 

template <class T, int (T::*method)()> 
int func(T& x) 
{ 
    // some complex code here calling method() 
    return (x.*method)(); 
} 

int main() 
{ 
    A a; 
    std::cout << func<A, &A::f>(a) << "\n" 
      << func<A, &A::g>(a) << "\n"; 
    return 0; 
} 

이 코드는 컴파일되어 작동합니다. 이제 두 가지 방법이 같은 사실 CONST 및 const가 아닌 것을 가정 : 멤버 함수가 서로 다른 서명을 가지고 있기 때문에

class A 
{ 
    int val_; 
public: 
    A() : val_(0) {} 
    int alloc() { return ++val_; } 
    int get() const { return val_; } 
}; 

이 시간이 우리 때문에 const를 규정에 동일한 접근 방식을 사용할 수 없습니다. 문제를 런타임으로 옮기는 것은 아무 것도 해결하지 못하는 것입니다.이 상황에서 func()를 두 함수로 다시 작성하지 않는 방법이 있습니까?

+0

'복잡한 코드'를 다른 곳에 캡슐화 할 수 있습니까? –

답변

1

전달 방법을 템플릿 매개 변수에서 함수 매개 변수로 변경할 수 있습니까? 예인 경우 다음을 입력하십시오.

#include <iostream> 

class A 
{ 
public: 
    int f() { return 1; } 
    int g() const { return 2; } 
}; 

template <class T, class F> 
int func(F method, T& x) 
{ 
    // some complex code here calling method() 
    return (x.*method)(); 
} 

int main() 
{ 
    A a; 
    std::cout << func(&A::f, a) << "\n" 
      << func(&A::g, a) << "\n"; 
    return 0; 
} 
+0

이것은 서명을 변경하는 것입니다. 그러나 OP가 그걸로 괜찮 으면 .. –

+0

고마워요,이 문제를 해결하는 방법 같습니다. 방금 연구 해봐야 할 메소드 포인터에 대해 '클래스 F'를 사용하는 것으로 나타났습니다. 어쩌면이 기능은 이러한 상황을 해결하는 것일 수 있습니다. – bkxp

+0

그래서'const'''''''''''''''''' volatile''의 모든 값 조합에 대해서도 작동 할 것입니다. – Jarod42