2017-11-29 3 views
1

그래서, 나는 지금까지 이런 일이? IOW, 다른 멤버 함수를 Foo 으로 전달하고 싶습니다. 그러나 대부분은 DoNothing에서 이 기본값이됩니다. 우리는 모든 멤버 함수를 안전하게 가정 할 수있다. 나는 인자를 취하지 않는다.기본값은

답변

2

Func(...)의 기본값은 &Foo::DoNothing()입니까?

당신은 기본적으로 그냥 필요한 기본 인수를 지정

struct Foo { int DoNothing() const { } }; 

template< 
    typename T, 
    typename C, 
    typename R = decltype(std::declval<const C>().DoNothing()) 
> 
T Func(C const* obj, 
     R (C::*mf)() const = &C::DoNothing, 
     T* maybe_unused = nullptr) 
{ 
    (obj->*mf)(); 
    return T{}; 
} 

주 당신이 다른 두 가지를 지정해야합니다 : 하나의 기본 멤버 함수를 위해 같이 전화를 추가로 기본 반환 값 유형을을 기본 주장에서 추론 될 수 없다.

+0

그건 문제가되지 않습니다. –

+0

@ ForeverLearning 유일한 오류는 Foo f가 const가 아니라는 것입니다. 그렇지 않으면 괜찮습니다. –

+0

@JakeFreeman 그래서 당신 의견에 * 문제가 무엇입니까? – Jodocus

0

변경 Func을에 :

template<typename T, typename R, typename C> 
T Func(C const* obj, R (C::*mf)() const=&C::do_nothing, T* maybe_unused = nullptr) 
{ 
... 
} 

과 나뿐만 아니라 const를 할 do_nothing()을 변경 : obj가 CONST이기 때문에 실제로으로 변경해야한다고

template<typename T, typename R, typename C> 
T Func(C const* obj, R (C::*mf)()=&C::do_nothing, T* maybe_unused = nullptr) 
{ 
... 
} 

참고.