무엇을 검색해야할지 모르겠으므로 가능한 한 최선을 설명하려고 노력할 것입니다. STL과에서 std::set
은 http://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 컨테이너만큼 포괄적입니다.
실제로 함수 포인터를 템플릿으로 전달할 수도 있습니다. – Puppy
@DeadMG : 맞지만, 템플릿 매개 변수에 (포인터가 아닌 *) 함수를 넘기는 경우와 마찬가지로, 위의 시그니처와 더 이상 작동하지 않습니다. 즉,'typename' 대신 함수 포인터가 있어야합니다. 템플리트 인수 목록에 입력하십시오. –
'template'를하는 것은 매우 합법적입니다. –
Puppy