2009-10-07 2 views
0

나는 템플릿을 사용하거나 사용하지 않는 것에 대해 궁금해했다. 다른 이유로 나는 템플릿이 몇 가지 이유 때문에 헤더 파일에 구현되어야한다는 것을 알았다. 다른 사람들이 그것을 사용하는 경우 소스가 필요할 경우 제 질문은, 내 질문은 무엇입니까? 다른 스레드의 대답의 논리에서 컴파일러가 라인이 템플릿 기능을 사용할 수 있는지 여부를 말할 수 있도록 다른 프로그램에서도 전체 구현이 필요합니다.다른 프로그램에서 사용할 헤더 파일에 템플릿 만 선언 할 수 있습니까?

그렇다면 다른 사람들이 자신의 라이브러리를 사용하기를 원하는 개발자는 템플릿이 좋지 않다고 생각하십니까? 아니요, 그렇다면 우리는 훌륭하고 템플릿이 사용됩니다.

또는 적어도 내 하드, 시간을 보냈다면 다른 사람의 코드를 저장하는 방법이 있습니까?

(나는 stl 벡터 등을 사용할 것이지만, 내 자신의 코드를 묻습니다 ... 템플릿은 멋지게 보이고, 많은 하드 코딩 된 줄이나 매크로를 남용하지만, 다른 사람이 원본보다 더 읽을 수 있다면 거의 의미

감사합니다, 조

당신이 라이브러리의 사용자가 템플릿을 사용할 수 있도록하려면
+0

자세한 내용을 알고 싶을 수도 있습니다. Boost와 STL은 템플릿 화되는 데 문제가 없습니다. 템플리트는 코드를 사용할 수 있고 그로부터 배울 수 있기 때문에 좋은 것입니다 (다른 사람들의 라이브러리를 변경하는 것은 좋은 생각이 아닐 수도 있습니다). 아마도 당신은 숨길 무언가가없는 한. 또한 이상하게 들리는 기본 클래스에 대해 나중에 언급합니다. 템플리트는 유형이 관련되어 있는지 상관하지 않습니다. 일반적인 런타임 다형성이 적합할까요? – UncleBens

+0

템플릿이 객체 팩토리를 필요로하므로 ... 하지만 다른 모든 것들은 다형성과 관련이 있습니다. C (CircleMUD 누군가?) 프로그래머였던 적이 있었고, 일하던 회사 때문에 C#으로 뛰어 들었습니다. 이제는 C++로 들어가기 시작했습니다. 그리고 C#은 매일 매일 보곤했기 때문에 조금 혼란 스럽습니다. – Jonathan

+0

특정 계층 구조에 대해 객체 팩토리가 필요하다고 생각합니다 (템플릿이 정상적으로 진행되는 것처럼). 한 가지는 공장도 다형성이 될 수 있다고 생각합니다. 그러나 필요한 템플릿을 인스턴스화하고 선언과 구현을 분리 할 수 ​​있어야합니다. – UncleBens

답변

4

, 자신의 소스 코드를 사용할 수 있어야 들에게) 프로젝트의 xD 여는 의미의 많은]한다 사용자.

그러나 대부분의 로직이 헤더에 전체 소스 코드가없는 템플릿이 아닌 클래스에서 발생하도록 템플릿 클래스를 디자인 할 수도 있습니다.

+0

네, 맞습니다. 최소한이 초기 디자인에서는 대부분의 함수를 비공개로 만들고 템플릿 함수 내에서 함수를 호출 할 수있을 것 같습니다. 더 많은 프로그래밍을하고 더 깊은 템플릿의 필요성을 알게 될 것입니다. – Jonathan

2

템플릿이 라이브러리 인터페이스의 일부인지 아니면 구현의 일부인지 여부에 따라 다릅니다.

인터페이스의 일부인 경우 (예 : 엔트리 포인트가 특정 템플릿 유형의 객체를 반환하는 경우) 그렇다면 템플릿 정의를 외부 세계에 노출해야합니다.

그러나 템플릿이 구현의 일부인 경우 라이브러리를 만든 후에는 라이브러리 소비자와 템플릿 정의를 공유 할 필요가 없습니다.

+0

흠, 저는 기본적으로 구현에 사용하고 싶습니다. 이렇게 좋은 디자인이라고 생각합니다. 템플릿을 쉽게 사용할 수 있지만 허가없이 프로젝트를 공유하지 마십시오. 하지만 다른 소프트웨어의 인클루드 파일을 넘겨 줄 때마다 소스 파일을 보이지 않도록 헤더 파일을 복사하고 편집해야합니다. 아니면 다른 방법이 있습니까? – Jonathan

+2

템플릿이 인터페이스의 일부가 아닌 경우 사용자에게 해당 헤더를 제공하지 않아도됩니다. 템플릿 헤더를 제공해야하는 경우 인터페이스 헤더 파일에 구현 헤더 파일이 필요 없도록 헤더 파일을 리팩터링해야합니다 (가능하지 않은 경우 실제로 구현되지는 않지만 일부입니다). 인터페이스의). –

0

비 템플릿 (종종 유형이 아닌) 코드 주위에 래퍼로 ​​템플릿을 작성할 수 있습니다.

장점

  1. 비 템플릿 구현 코드의 소스

    배포 할 필요가 없다 ...입니다.
  2. 템플릿 팽창을 줄이는 좋은 방법입니다.

명백한 단점은 추상화 및 오버 헤드가 추가로 발생하고 유형이 안전하지 않은 구현 코드에 분명히주의가 필요하다는 것입니다. 필자는 템플릿 래퍼를 전문으로하는 비 템플릿 코드에 추상 '도구'클래스를 정의하는 경향이 있습니다. 메서드는 주로 도구 상태에 영향을주지 않지만 void * 매개 변수로 전달 된 개체에 대해서는 도구라고 부릅니다. 도구 클래스는 몇 가지 메서드에서 대부분의 형식 안전하지 않은 문제로 캡슐화합니다. 템플릿은 또한 사용자가 실제로 사용하는 typesafe wrapper를 제공합니다. 안전하지 않은 코드와 인터페이스하고, 도구 인스턴스를 제공하고, 타입 변환을 수행합니다.

예를 들어, 트리 데이터 구조를 구현하는 경우 대부분의 트리 알고리즘은 타입 - 안전하지 않은 노드 및 데이터 항목을 void * 포인터 (또는 노드 및 데이터 선언이 있지만 정의되지 않은 struct가있는 node * 및 data * 포인터)로 간주합니다.나는 노드 생성, 폐기 및 기타 기본 작업을위한 순수한 방법으로 추상 트리 도구 기반을 가질 것이며 래퍼 템플릿은 기본적으로 트리 도구를 전문화하고 노드 및 데이터 항목의 정확한 유형을 알고있는 메소드 구현을 제공하며, 도구의 인스턴스를 클래스 멤버로 유지하는 것입니다. 사용자에게 랩퍼는 다른 유형과 마찬가지로 형식 유지 컨테이너입니다.

BTW - 템플릿 래퍼를 구현할 때 dependent name 문제에주의하십시오.

관련 문제