2012-02-10 3 views
5

먼저 문제가 발생하지는 않지만 가능한 한 간단하게 유지하려고합니다. Math이라는 템플릿 기반 클래스를 사용하고 있으며 다른 많은 것들 외에 무작위 기능이 있습니다.템플릿이 적용된 클래스의 정적 비 템플릿 함수

서로 다른 유형의 임의 함수와 임의의 시드를 설정하는 함수입니다. 따라서 시드 함수를 제외한 모든 함수는 class Real 유형을 사용합니다. 나는 씨앗을 설정할 때 좀 랜덤 (하하) 함수를 호출 할 수 있도록 입력 통과해야 :이 실제 문제가 아니라 다시

Math<u32>::SeedRandom(System::time()); 

을,하지만 난 그것을 할 수 있는지 궁금합니다 <u32>을 사용할 필요없이 동일한 결과를 얻을 수 있습니다. 여기

Math 클래스에서 미리보기 : BTW

template <class Real> 
class Math 
{ 
public: 
    static void SeedRandom(u32 seed) { srand(seed); } 
    static Real UnitRandom() { return (Real)((f64)rand()/(f64)RAND_MAX); } 
}; 

. f64doubleu32 ~ unsigned int으로 typedef되었습니다.

답변

4

정적 함수는 ClassName::FunctionName에 의해 호출되어야합니다. ClassName은 템플릿이기 때문에 템플릿 인수를 지정해야합니다. 정적 함수는 객체 (예 : object.StaticFunctionName)에서 호출 할 수 있으므로 객체가 이미있는 경우 템플릿 인수를 지정하지 않아도되지만 객체에 정적 함수를 호출하는 것은 개인적인 편향된 견해로는보기 흉합니다.

클래스와 동일한 네임 스페이스에서 비회원 (필요한 경우 템플릿에 친구)으로 기능을 추가하려는 경우 어떻게해야합니까?

+0

그래, 그 함수를 호출하는 싱글 톤 객체가 가능 하겠지만, 그 경우에는 정말 못생긴 것이다. :) 코드를 작성하는 방법이 있는지 알고 싶기 때문에 유형을 지정할 필요가 없다. 조금만 시도해 보았습니다. 이걸'Math :: SeedRandom ((u32) System :: time());'과 같이 호출 할 수 있습니다. 이것은 유형이 사용되지 않는다는 것을 적어도 보여줄 것입니다. 그러나 컴파일 시간이 불필요하게 길어지며, 더 이상 추악한 경우에만 ''을 호출하십시오. – v01pe

+0

@ v01pe : 내 음란 한 편향된 의견에서'void *'를 사용하면 형식이 사용되지 않는다는 것을 결코 암시하지 않습니다. IMO는 이미 말했듯이 독립형 기능이 최상의 솔루션입니다. 독립 실행 형 함수는 어떤 식 으로든 C++에서 OOP의 패러다임에 모순되지 않습니다. –

+0

물론 여러분이 옳습니다.'void * '를 사용한다고해서 반드시 그런 것은 아닙니다! – v01pe

2

Math::SeedRandom으로 호출 할 수있는 기능을 만들 수있는 방법이 없습니다 (단, Math은 템플릿이 작성되지 않은 것만 제외하고). 가장 좋은 방법은 SeedRandom을 별도의 템플릿이 아닌 클래스로 옮기거나 Math<whatever>::SeedRandom으로 호출하는 것입니다.

+0

임의의 함수와 같은 클래스에 보관하고 싶지만 다른 방법으로는 불가능하다는 점을 지적 해 주셔서 감사합니다. – v01pe

0

저는 "수학"의 인스턴스를 상상하기가 어렵 기 때문에 "수학"이라는 수업에 회의적입니다. 그것의 소리에서, 당신은 몇몇 템플릿 자유 함수들과 함께 네임 스페이스를 사용하기를 원할 것입니다. 당신이이 문제를 겪고 있다는 것은 아마 당신이하고있는 일을해서는 안된다는 신호 일 수 있습니다.

C++는 다중 패러다임 언어이므로 Java와 같은 언어와 달리 모든 것이 객체의 일부가되도록 강요하지 않습니다.

+0

사실, 클래스에는 함수 내에 사용되는 템플릿 화 된'const'도 포함되어 있습니다.또한 위에서 언급 한 기능은 템플릿을 필요로하지 않는 유일한 기능입니다. 나는 이것을 할 수있는 최선의 방법이 아니라는 것을 알고 있으며 언젠가 그것이 리팩토링하는 것이지만, 지금은 완벽하게 그것의 목적에 부합합니다. – v01pe

관련 문제