아래의 소스코드는 뇌를 자극하는 C++ STL교재의 예문인데요
책에는 For_each함수를 호출하는 문장에서 <int*,void (*)(int)>가 삽입되어 있으므로 명시적으로 함수포인터가 포함된 함수 템플릿을 호출한다고 하는데요.
#include <iostream>
#include <string>
using namespace std;
template<typename IterT,typename Func>
void For_each(IterT begin,IterT end,Func fp)
{
while(begin!=end)
fp(*begin++);
}
template<typename T>
void Print(T data)
{
cout<<data<<" ";
}
int main()
{
int arr1[5]={1,2,3,4,5};
For_each<int*,void (*)(int)>(arr1,arr1+5,Print<int>);
return 0;
}
그런데
그 다음 책에나온 소스코드는 함수객체를 For_each함수 템플릿에서 호출한 건데
컴파일이나 실행시 전혀 오류는 없지만 한번 위의 소스코드처럼 명시적으로 함수템플릿을 호출하고 싶은데요.
For_each(arr,arr+5,PrintFunctor<int>());
For_each(arr1,arr1+3,PrintFunctor<string>("\n"));중에
For_each(arr,arr+5,PrintFunctor<int>());을 명시적으로 호출하고 싶다면 For_each와 매개변수 사이에 어떤 문장을 넣어야 명시적으로 함수 템플릿을 호출할 수 있나요?
책에는 전혀 나와있지 않아서 감을 잡을수 없지만 아무래도 <int*,???>형식의 선언문을 써야 할 것 같은데 함수 템플릿에서 명시적으로 호출하기 위해서 함수객체는 어떤 선언문을 삽입해야 하는지 제 능력으로는 도무지 알수 없네요.
알고 계시는 분이 있으시면 답변 좀 해주시면 좋겟습니다.
#include <iostream>
#include <string>
using namespace std;
template<typename IterT,typename Func>
void For_each(IterT begin,IterT end,Func fp)
{
while(begin!=end)
fp(*begin++);
}
template<typename T>
struct PrintFunctor
{
string sep;
public:
explicit PrintFunctor(const string& s=" "):sep(s){}
void operator()(T data)
{
cout<<data<<sep;
}
};
int main()
{
int arr[5]={1,2,3,4,5};
For_each(arr,arr+5,PrintFunctor<int>());
cout<<endl;
string arr1[3]={"소","개","말"};
For_each(arr1,arr1+3,PrintFunctor<string>("\n"));
return 0;
}