2010-12-18 4 views
3

무엇을 검색해야할지 모르겠으므로 가능한 한 최선을 설명하려고 노력할 것입니다. STL과에서 std::sethttp://cplusplus.com에서클래스 또는 함수를 템플릿 매개 변수로 사용하는 경우

template <class Key, class Compare, class Allocator> class set;

으로 정의된다 : 비교 클래스 :

비교 컨테이너 요소와 동일한 유형의 두 인수를하고 부울을 반환하는 클래스입니다. 표현 comp (a, b)는 comp가이 비교 클래스의 객체이고 a와 b가 컨테이너 [...]의 요소입니다. 함수 호출 연산자를 구현하는 클래스이거나 함수 [...]에 대한 포인터 일 수 있습니다.

나는 Compare 템플릿 매개 변수에 대해 이야기하고 있습니다. 내가 함수 호출 연산자를 구현하는 클래스 템플릿 매개 변수가있는 템플릿 클래스를 작성한다면 나는 그렇게를 작성한다면

그래서, 나는,

template <class T, class Combine> 
class MyClass 
{ 
public: 
    Combine func; 
    MyClass() 
    { 
     func = Combine(); 
    } 
    T do_it(T a, T b) 
    { 
     return func(a, b); 
    } 
}; 

class IntCombine 
{ 
public: 
    int operator() (int a, int b) 
    { 
     return a + b; 
    } 
}; 

//... 
MyClass<int, IntCombine> ob; 
ob.do_it(4, 5); 

를 작성하거나 것 두 번째 템플릿 매개 변수는 함수입니다.

template <class T, T Combine(T, T)> 
class MyClass 
{ 
public: 
    Combine func; 
    MyClass() 
    { 
     func = Combine; 
    } 
    T do_it(T a, T b) 
    { 
     return func(a, b); 
    } 
}; 

int IntCombine(int a, int b) 
{ 
    return a + b; 
} 

//... 
MyClass<int, IntCombine> ob; 
ob.do_it(4, 5); 

그러나 STL에서는 set 클래스를 사용할 수 있습니다. 어떻게 실현 되는가? 위 코드는 내 정의 ob의 두 번째 템플릿 매개 변수가 각각 operator() 또는 함수를 구현하는 클래스 인 경우에만 작동하지만 둘 다 작동하도록 MyClass을 쓸 수 없습니다.

예제가 상당히 쓸모 없게 보일 수 있습니다. 기본적으로 요소를 결합 할 수있는 컨테이너를 작성하려고합니다. 이는 STL 컨테이너만큼 포괄적입니다.

답변

0

위 코드는 내 정의 ob의 두 번째 템플릿 매개 변수가 각각 operator() 또는 함수를 구현하는 클래스 중 하나이지만 MyClass를 쓸 수 없어 둘 다 작동 할 때만 작동합니다.

예를 수행 할 수 있습니다이 정확히 example of the std::set constructor을 따르고

template <typename F> 
struct foo { 
    F f; 
    void call() { 
     f(); 
    } 
}; 

void function() { 
    std::cout << "function called" << std::endl; 
} 

int main() { 
    foo<void(*)()> a = { function }; 
    a.call(); 
} 

. 중요한 점은 함수 포인터를 사용하는 경우 템플릿 매개 변수가 이 아니고 함수 포인터 인 (여기 void (*)())입니다. 실제 함수 포인터를 별도로 저장해야합니다.

+0

실제로 함수 포인터를 템플릿으로 전달할 수도 있습니다. – Puppy

+0

@DeadMG : 맞지만, 템플릿 매개 변수에 (포인터가 아닌 *) 함수를 넘기는 경우와 마찬가지로, 위의 시그니처와 더 이상 작동하지 않습니다. 즉,'typename' 대신 함수 포인터가 있어야합니다. 템플리트 인수 목록에 입력하십시오. –

+0

'template '를하는 것은 매우 합법적입니다. – Puppy

관련 문제