템플릿 이전에 유형에 구속받지 않는 C++ 코드는 런타임 다형성을 사용하여 작성해야했습니다. 그러나 템플릿을 사용하여 두 가지 기술을 결합 할 수 있습니다.
예를 들어 나중에 검색 할 수 있도록 모든 유형의 값을 저장한다고 가정합니다. 템플릿이 없다면, 당신은이 작업을 수행해야 할 것 :
struct PrintableThing
{
// declare abstract operations needed on the type
virtual void print(std::ostream &os) = 0;
// polymorphic base class needs virtual destructor
virtual ~PrintableThing() {}
};
class PrintableContainer
{
PrintableThing *printableThing;
public:
// various other secret stuff
void store(PrintableThing *p);
};
이 라이브러리의 사용자가 자신의 데이터를 주위에 포장하고 그 위에 print
기능을 구현하기 위해 손으로 PrintableThing
자신의 파생 버전을 작성해야합니다.
하지만 이러한 시스템 주위에 템플릿 기반의 레이어를 포장 할 수 있습니다
template <T>
struct PrintableType : PrintableThing
{
T instance;
virtual void print(std::ostream &os)
{ os << instance; }
PrintableType(const T &i)
: instance(i) {}
};
을 그리고 또한 PrintableContainer
클래스의 선언에서 헤더 라이브러리의에 메소드를 추가 :
template <class T>
void store(const T &p)
{
store(new PrintableType(p));
}
이것은 <<
연산자에 컴파일시 바인딩을 사용하여 print
을 구현하는 템플릿과 런타임 다형성 사이의 다리 역할을하며 복사 생성자 a lso (물론 중첩 된 인스턴스의 소멸자로 전달).
이렇게하면 라이브러리의 소스에서 숨길 수있는 구현과 함께 런타임 다형성을 기반으로 라이브러리를 작성할 수 있지만 편리하게 만들기 위해 "설탕"템플릿이 조금 추가되었습니다 용도.
문제가 있는지 여부는 필요에 따라 다릅니다. 런타임 다형성은 때로 정확히 당신이 필요로하는 것, 즉 그 자체로 순수한 기술적 이점을 가지고 있습니다. 단점이라면 컴파일러가 효과적으로 인라인 할 수있는 능력을 의심 할 여지없이 줄일 수 있습니다. 위쪽에 컴파일 시간과 이진 코드가 부풀어 오를 수 있습니다.
예제는 std::tr1::function
과 boost::any
입니다.이 템플릿은 매우 깨끗하고 현대적인 C++ 템플릿 기반 프론트 엔드를 가지고 있지만 런타임 다형성 컨테이너로 사용됩니다.
템플릿의 구현 세부 사항을 정확히 표시하고 싶지 않은 이유는 무엇입니까? –
@Neil : 헤더 파일을 사용하여 미리 컴파일 된 라이브러리를 제공하려고한다고 가정하고 헤더 파일을 제공하여 구현을 노출하고 싶지는 않습니다. 코드를 다른 사람에게 넘겨주고 싶지 않은 이유는 여러 가지가 있습니다. –
@Daniel Sigh. 죄송 합니다만, 귀하의 가정 (또는 누군가)을 원하지 않습니다. OP의 이유를 원합니다. 왜 SO에 게시하는 거의 모든 사람들이 "추측"하거나 "추측"하겠다는 강한 충동을 느끼고 있습니까? –