2013-05-27 2 views
6

sincos과 같은 trig 함수가 컴파일 타임에 미리 계산 된 Todd Veldhuizen의 metaprogramming guide의 마지막 예제를 보니 정말 감명 받았습니다. 솔직하게 말해서 그것은 나를 멀리 날려 버렸고 만약 당신이 루프에서 이런 엄청난 수의 코드를 작성한다면 나는 성능이 향상 될 수있다. 그러나 질문 1메타 프로그래밍에서 사용할 수있는 수학 연산자는 무엇입니까

, 그것은 (sin 또는 cos처럼 실제 수학 라이브러리 함수를 호출하는) 어떤으로 사용할 수있는 라인이 런타임 도구로 사용할 수 있습니다 무엇을 잇는 위치를 궁금해 나를 주도 컴파일 타임 수학 연산자.

Todd의 예제는 일반적인 산술 연산을 사용하여 수동으로 trig 함수를 계산해야합니다.

내가 컴파일러가 모든 일반 수학 함수 *+-/하지만 아무것도 할 수 있는지 다음 생각하는 건가요?

이러한 경우 2

질문, 당신은 단지 오른쪽 정수에 sincos 계산을 위해 컴파일 시간의 결과를 얻을 수있을 것? 즉, sin 45.5 같은 결과를 미리 컴파일 할 수 없습니까? 템플릿은 매개 변수로 정수를 받아 들일 수있는 경우

아니면, 당신은 몇 가지의 정수를 사용할 수 있으며, 123을 전달하고 float 값의 sin를 얻을 수 1.23을 같은 클래스에서 그들을 밖으로 float을합니다. 그러나 질문 1

답변

2

, 그것은 (죄 또는 왜냐하면 같은 실제 수학 라이브러리 함수를 호출하는) 어떤으로 사용할 수있는 라인이 런타임 도구로 사용할 수 있습니다 무엇을 잇는 위치를 궁금해 나를 주도 컴파일 타임 수학 연산자.

  • 명명 된 기능은 constexpr를 선언하는 경우에만 constexpr의 규칙을 순종, 컴파일 타임에 사용할 수 있으며, 컴파일 타임 상수로 불린다.
  • 사용자 정의 데이터 유형은 컴파일시 상수의 constexpr 생성자를 통해 생성 된 경우에만 컴파일 타임에 사용할 수 있습니다.
  • 컴파일 타임 상수 내장 유형에서 작동하는 모든 내장 연산자는 컴파일 타임 상수를 제공합니다.
  • 원본이 컴파일 타임 상수 인 경우 내장 함수 간의 모든 유형 변환은 컴파일 타임 상수를 제공합니다.

그래서,이 네 개의 수학 연산자에 국한되지, 당신은 % 및 기타뿐만 아니라 사업자뿐만 아니라 템플릿 메타 기능 및 constexpr 표현식을 사용할 수 있습니다.

질문이 경우 2

, 당신은 바로, 죄와 전체 숫자에 대한 계산 왜냐하면 컴파일 시간의 결과를 얻을 수있을 것? 즉, 죄 45.5와 같은 결과를 미리 컴파일 할 수는 없습니다, 맞습니까?

예 아니오. C++ 03에서는 내장 함수와 템플릿 메타 함수로 제한되며 constexpr을 사용할 수 없습니다. 따라서 sin은 부동 소수점 유형이 템플리트에서 허용되지 않으므로 정수 상수에서만 작동 할 수있는 템플리트 메타 기능이어야합니다. 그러나 분수 나 고정 소수점 값에 대한 템플릿을 정의하고 해당 템플릿에 대해 sin 템플릿을 제공 할 수 있습니다. 꽤 지루한 일이지만 템플릿 인스턴스화 제한으로 쉽게 끝날 수 있습니다.

C++ 11 이후에는 부동 소수점 매개 변수를 사용하는 함수를 작성하여 해당 함수로 작업 할 수 있습니다.

+1

시리즈 확장으로 컴파일 할 때 사인을 계산하려면 http://www10.informatik.uni-erlangen.de/~pflaum/pflaum/ProSeminar/meta-art.html을 참조하십시오. – jmihalicza

관련 문제