는 다음 클래스 고려 :메서드 시그니처의 특정 인수의 유무에 템플릿 특수화를 적용 할 수 있습니까?
이class MyClass
{
public:
template<class T> typename T::result_type apply(T& func)
{
if (is_int())
{
return func(int(0));
}
return func(double(0));
}
...
};
(코드는 정말 유용한 보이지 않는,하지만 내 지점을 증명하기 만 인위적인 샘플입니다)
어쨌든, 일반적인 펑이 같은 것입니다 :
struct MyFunc
{
typedef void result_type;
template<class V> void operator()(V)
{
// do something
}
};
하나는과 같이 사용합니다 :
MyClass c;
MyFunc f;
c.apply(f);
제 질문은 - MyClass::apply
은 원래 하나의 외에 다른 약간의 버전의 functor 을 인식하도록 변경할 수 있습니다. 예를 들어 호출자 개체 참조가 다른 모든 매개 변수와 함께 전달 될 것으로 예상하는 경우 이 :
struct MyFuncEx
{
typedef void result_type;
template<class V> void operator()(const MyClass& caller, V)
{
// do something
}
};
그래서, 다음의 코드도 컴파일 것 :
MyClass c;
MyFunc f;
c.apply(f);
MyFuncEx f2;
c.apply(f2);
를 보너스로 나는 펑 모두 과부하 포함 된 경우 컴파일을 실패 다음 즉, 실패를 컴파일하고 싶습니다 :
struct MyFuncSmartAss
{
typedef void result_type;
template<class V> void operator()(V)
{
// do something
}
template<class V> void operator()(const MyClass& caller, V)
{
// do something
}
};
...
MyClass c;
c.apply(MyFuncSmartAss());
그러나 긴 오버로드가 짧은 것보다 우선 순위를 갖는 한 그렇게 중요하지 않습니다.
boost :: bind()는 친구입니다 –
그리고 ??????????? – mark
boost :: bind를 사용하면'operator()'의 단일 오버로드로 살 수 있고 두 번째 호출에서도 단일 인수 만 취하는'operator() '를 제공하기 위해 caller에 클로저를 만들기 위해 호출 사이트를 결정할 수 있습니다 케이스. –