2014-06-05 2 views
0

저는 수학 연산을 쉽게 수행 할 수있는 템플릿 배열을 만듭니다. 예를 들어, 당신은 dB로 선형 값에서 이동하려면 다음과 같이 뭔가를 할 수 :템플릿 함수 다형성

buf = 10 * buf.log10(); 

내가 인수로 DspBuffer 기준을 비 멤버 템플릿 함수에 "LOG10"와 같은 방법을 변경하고 싶습니다. 미학적 그때 앞의 코드는 다음과 같이 것이기 때문에 그 많은 더 좋은 것 같아요 :

buf = 10 * log10(buf); 

이 방법의 유일한 문제는 일부 클래스 DspBuffer에서 상속, FixedPtDspBuffer 등 (고정 소수점 데이터 유형을 사용하는 경우) 및 ComplexDspBuffer (복잡한 값의 경우). 때로는 함수에 과부하가 필요하며 비 멤버 템플릿 함수를 사용하여 함수를 수행 할 수 있는지 잘 모르겠습니다. 예를 들어, log10() 및 고정 소수점을 사용하여 고정 된 지점으로 다시 변환 할 때 암시 적으로 "플로어"를 수행하는 대신 기본 log10 결과의 결과를 반올림합니다.

비회원 템플릿 함수를보다 구체적으로 (예 : DspBuffer를 사용하고 DspBuffer에서 상속 한 FixedPtDspBuffer를 사용) 오버로드 할 수 있습니까, 아니면 실패 할 수 있습니까?

+0

(HTTP : // EN .wikipedia.org/wiki/Visitor_pattern). – Jarod42

답변

1
당신은 확실히 같은 각각 해당 지역의 코드는, 서브 클래스 작업 템플릿 또는 아니에요 것을 알고하지 않는 한 DspBuffer& 또는 FixedPtDspBuffer는 등 그러나 이러한 과부하가되지 않습니다 걸릴 당신의 log10로 무료 기능에 과부하를 제공 할 수

호출됩니다. 따라서 가상 메서드 호출과 비슷한 근처의 자유 함수는 항상 선택된 기본 클래스 오버로드를 호출합니다.

가상 스타일의 디스패치를 ​​다시 얻는 한 가지 방법은 free 함수가 호출하는 개체에 가상 메서드를 구현하는 것입니다. 원하는 경우 보호 또는 비공개 메소드에 표시하고 함수는 친구로 표시 할 수 있습니다. 파이썬은 실제로 이런 종류의 일을 많이합니다. len(obj)과 같은 무료 함수 호출은 obj.__length__()입니다.

(나는이 Jarod42 제안 방문자 패턴과 구조적으로 유사하다 생각하지만, 그것은 이름이 동의에 자신을 잡고 방문하지 않습니다.) 당신은 [방문자]에서 보일 수