2014-12-05 3 views
-1

템플릿 클래스 내에 비 템플릿 함수를 배치하는 방법이 있는지 궁금합니다. 간단히 말해서, 함수는 포인터를 조작하기 때문에 컴파일러가 각 유형에 대해 함수를 반복하지 않으므로 형식이 없습니다. 이것이 가능한가? 이템플릿 클래스의 비 템플릿 함수

template <typename T> 
class CLASS{ 

}; 

과 같은 코드가있는 경우

그럼 내 각 유형의 T 에 대해 반복 될 각 기능은 단순히 그

내가하는 기능을하고 싶은 일이하고 싶지 않아 모든 유형에 정적이어서 각 유형마다 메모리에 반복되지 않습니다.

+0

이미 시도해 보셨습니까? – nbro

+0

템플릿 클래스의 모든 멤버 함수는'template' 자체로 선언하지 않는 한 비 템플릿입니다. 그러나 이것은 아마도 당신이 요구하는 것과 정확히 일치하지 않을 것입니다. –

+0

이 템플릿과 같은 코드를 가지고 있다면 클래스 Object {} 다음에있는 각 함수가 클래스 – user3813249

답변

1

나는 당신의 문제가이 같은 것으로 가정 기본 클래스

class BASE_CLASS { 
public: 
    static void not_a_templated_function(); 
}; 

template <typename T> 
class CLASS: public BASE_CLASS { 

}; 
1

에서 기능을 상속 :

template <typename T> 
struct Foo { 
    //.. 
    void bar() { 
    /* most or all code here is the same for all T, 
     and uses nothing that depends on T. */ 
    }; 
}; 

그리고 당신이 그와 같은 방식으로 "바"를 정의하고 싶은이 "Foo"를 인스턴스화 할 때마다 하나의 막대 기능 만 사용할 수 있습니다. 즉, Foo<int>::barFoo<double>::bar과 다른 기능으로 사용하고 싶지는 않습니다.

"bar"기능은 클래스 템플릿의 구성원이고 인스턴스화의 각 구성원이기 때문에 수행 할 수 없습니다.

대신 할 수 있고해야할 일은 "모든 T에서 동일한"코드가있는 도우미 (무료) 함수를 정의하는 것입니다. 이런 식으로 뭔가 :

namespace { 
    void Foo_bar_helper(/*..*/) { 
    /* common code goes here. */ 
    }; 
}; 

template <typename T> 
struct Foo { 
    //.. 
    void bar() { 
    Foo_bar_helper(/* pass the "guts" of Foo<T> here. */); 
    }; 
}; 

일반적으로는, 바 기능이 컴파일러에 의해 인라인 얻을 것이다 정말 남아있는 모든 도우미 함수에 매개 변수로 푸 개체의 "용기"의 확장 (있는 경우)입니다 (원하는대로 외부 링키지를 사용하거나 사용하지 않고 구현할 수 있습니다).

또 다른 옵션은 템플릿이 아닌 기본 클래스에서 상속하는 것입니다.하지만 개인적으로 그런 종류의 상속을 사용하는 것을 좋아하지는 않으며 Foo 객체의 "내장"을 계속 전달해야합니다. (만약에 어떠한).

관련 문제