2013-11-22 2 views
2

방금 ​​C++의 템플릿에 대해 배우기 시작했고 전문 용어를 잘 모르고 있지만 이것이 내가 원하는 것입니다. 세 가지 기능이 있다고 가정 해 보겠습니다. 템플릿 기능에 과부하가 있지만 사용하지 않고 함수 "컴퓨팅"을 정의 할 수있는 방법이 있나요C++ 템플릿이 가능합니까?

void compute(double (*func)(double)) 
{ 
    func(1); 
    std::cout << "1 argument here"; 
} 

void compute(double (*func)(double, double)) 
{ 
    func(1,2); 
    std::cout << "2 arguments here"; 
} 

void compute(double (*func)(double, double, double)) 
{ 
    func(1,2,3); 
    std::cout << "3 arguments here"; 
} 

:

double fa(double a) 
{ 
    return a; 
} 

double fb(double a, double b) 
{ 
    return (a+b); 
} 

double fc(double a, double b, double c) 
{ 
    return (a+b+c); 
} 

하자 내가라는 컴퓨팅의 새로운 기능에 FA, FB 또는 FC 기능을 전달하고 싶은 말은 대신에? 그래서 임의의 수의 인수를 가진 함수를 전달할 수 있습니다.

+0

는 항상 1,2,3을 통과하는 ... ? – chris

+0

이것은 Haskell이나 OCaml이 아니기 때문에 C++은 실제로 다중 인수 함수를 가지고 있으며 currying하지 않습니다. 따라서 그것은 'void compute (double (* func) (double, double, double))'이어야합니다. ' –

+0

Ops, fixed. 네, 항상 1,2,3을 통과한다고 해봅시다. – Winten

답변

2

네, 가능합니다 :

template <typename... T> 
void compute(void (*func)(T...)) { 
    func(/* magic goes here (see below) */); 
    std::cout << sizeof...(T) << " arguments here\n"; 
} 

이 까다로운 사업의 오른쪽 숫자를 전달하는 데 필요한 마법 : 당신은 예를 들어 유형과 인수의 수를 모두 추론 가변 인자 템플릿을 사용하십시오 인수. 이는 일련의 인덱스를 생성함으로써 확실히 실행 가능하다. 위의 코드에서 제외 된 다른 세부 사항은 임의로 변경할 수있는 T입니다. 시퀀스가 double 일 때만 잠 그려면 std::enable_if<cond, Type> 또는 static_assert()과 함께 적절한 유형 특성을 사용할 수 있습니다.

6

벤 (다른 벤)은 이미 가변적 인 템플릿을 제안했습니다.

다음은 인수의 변수 번호를 추가하지 펑터의 :

struct { 
    double operator()(double first) const 
    { 
     return first; 
    } 

    double operator()(double first, double second) const 
    { 
     return first + second; 
    } 

    template<typename... T> 
    double operator()(double first, double second, T... t) const 
    { 
     return (*this)(first + second, t...); 
    } 
} variadic_add; 

그리고 당신은 다음과 같이 호출 할 수 있습니다 :

template<typename Reducer> 
void compute(Reducer reduce) 
{ 
    reduce(1); 
    std::cout << "1 arguments here"; 
    reduce(1,2); 
    std::cout << "2 arguments here"; 
    reduce(1,2,3); 
    std::cout << "3 arguments here"; 
    reduce(1,2,3,4); 
    std::cout << "4 arguments here"; 
} 

compute(variadic_add); 
관련 문제