2016-11-05 2 views
1

템플릿을 사용하는 코드가 있습니다. 한 예는 다음과 같습니다.C++ - const vs non const member 함수 - 함수 포인터가있는 템플릿

template <class MT> 
struct class_method_info; 

template <class T, class Res, class... Args> 
struct class_method_info<Res(T::*)(Args...)> 
{ 
    typedef std::tuple<Args&&...> ArgsTuple; 
    typedef T ClassType; 
    typedef Res RetVal; 
    static constexpr std::size_t ArgsCount = sizeof...(Args); 
    static constexpr bool IsClassMethod = true;  
}; 

이것은 const가 아닌 멤버 함수 포인터에서 작동합니다.

Res(T::*)(Args...)Res(T::*)(Args...) const으로 변경하면 const 함수 포인터를 전달할 수 있습니다. 그러나 이것이 솔루션을 작동 시키더라도 내 코드가 엉망이되었습니다. 이제 모든 것이 두 배가되고 많은 것들이 있기 때문입니다.

다른 방법이 있습니까?

당신은 다른 하나에서 구현의 대부분을 상속 것이라고, const this에 대한 전문성을 추가 할 수 있습니다
+0

당신이 구현 템플릿 부모 클래스를 생성하고 모든 통과로 간주해야 템플릿 매개 변수가 필요합니까? –

+0

유스 케이스가 무엇인지 모르겠지만'std :: mem_fn'이 요구 사항을 충족시키지 못했 으면 좋겠어요. – Arunmu

답변

4

:

template <class MT> 
struct class_method_info; 

template <class T, class Res, class... Args> 
struct class_method_info<Res(T::*)(Args...)> 
{ 
    typedef std::tuple<Args&&...> ArgsTuple; 
    typedef T ClassType; 
    typedef Res RetVal; 
    static constexpr std::size_t ArgsCount = sizeof...(Args); 
    static constexpr bool IsClassMethod = true; 
    static constexpr bool IsConstThis = false; 
}; 


template <class T, class Res, class... Args> 
struct class_method_info<Res(T::*)(Args...) const> : class_method_info<Res(T::*)(Args...)> 
{ 
    static constexpr bool IsConstThis = true; 
}; 

demo

관련 문제