여러 인수를 취하는 함수를 단 하나의 인수 (다른 인수의 값 제공)로 변환하는 랩퍼가 있습니다. 지금은 예를 들어, 할 수 있도록오브젝트의 함수 연산자의 인수 유형 검색
template <class R, class F, class A0, class A1>
class CMyWrapper {
F m_f;
A0 m_default_a0;
public:
CMyWrapper(F f, const A0 &default_a0)
:m_f(f), m_default_a0(default_a0)
{}
R operator()(const A1 &a1) const
{
return m_f(m_default_a0, a1);
}
};
template <class R, class A0, class A1>
CMyWrapper<R, R (*)(const A0&, const A1&), A0, A1>
SupplyConstArg(R (*fun)(const A0&, const A1&), const A0 &default_a0)
{
return CMyWrapper<R, R (*)(const A0&, const A1&), A0, A1>(fun, default_a0);
}
double MyFunc(const double &x, const double &y); // some function
:이 코드는 기능와 함께 작동 SupplyConstArg(MyFunc, 1.23)(4.56)
은 MyFunc(1.23, 4.56)
을 호출합니다 (이 표현식의 왼쪽 부분은 첫 번째 인수를 계속 제공하는 함수 객체입니다). 여태까지는 그런대로 잘됐다.
는 그러나, 나는 기능을 위해 일하고 유사한 기능을 서면으로 어려움 (나는 가능한 성능 향상을 위해 함수 포인터를 피하기 위해 같은 것) 기능보다는 개체를 가지고있다. 가정 :
struct CMyFunObj {
double operator()(const double &x, const double &y);
};
내 문제는 내가 같은 함수 객체의 인스턴스 주어진 반환 형식 또는 인수의 유형을 일치 어떻게 입니까? 지금까지 나는 다음과 같이 생각해 냈습니다.
template <class F, class R, class A0, class A1>
R Infer(F f, R (F::*fun)(const A0 &a0, const A1 &a1) = &F::operator());
두 번째 인수가 지정된 경우에만.
Infer(CMyFunObj(), &CMyFunObj::operator());
두 번째 인수를 생략하고 기본값을 사용하면 안됩니다. 어떤 아이디어를 C++ 03에서 어떻게 할 것인가?
std :: bind의 일부를 다시 구현하려는 것 같습니다.C++ 03에서는이 부분이 std :: bind1st에 의해 제공됩니다. –
@ n.m. 그래, 나는 이것이 비슷하다는 것을 알고있다. 내 유스 케이스에서는 상수 인수가 항상 첫 번째가 아니므로 반환 된 함수 객체의 함수 연산자에 지정된 "가변 인수"의 색인을 지정하는 몇 가지 기능이 필요합니다. 이 부분을 이미 수행 할 수 있습니다. 함수 객체에 대한 유형 유추로 막 붙어 있습니다. 'std :: bind'에 대해서도 같은 일을 할 수 있을지 확신 할 수 없습니다. –