2012-12-04 3 views
1

템플릿 클래스가 있으므로 foo라고 부르 자. 구현시 다음과 같은 정보가 표시됩니다.템플릿 함수 헤더를 더 짧게 만드는 방법

template<class a, class b ... class x> 
void foo<a, b, ..., x>::function1() { } 

template<class a, class b ... class x> 
void foo<a, b, ..., x>::function2() { } 

이제 간단하게 읽고 싶습니다. 나는

template<class a, class b... class x> foo<a, b, ..., x> 

다음 (짧은) 위의 함수 헤더 간단하게하는 일을 정의 에 대한 형식 정의 같은 일을 할 수 있을까?

THanks!

+3

글쎄, 당신은 항상 클래스에 인라인 함수 정의를 넣을 수 있습니다 ... – abarnert

+1

얼마나 많은 템플릿 매개 변수가 있습니까? 그것은 주요 이슈처럼 보입니다. – chris

+0

문제는 구현을 분리하고 싶습니다. 그리고 6 개의 매개 변수가 있습니다. – WhatABeautifulWorld

답변

2

첫 번째 질문은 클래스 템플릿에 많은 매개 변수가 실제로 필요합니까? 그렇다면, 그들은 어떤 방법으로 포장 될 수 있습니까?

둘째, 라인 밖의 모든 함수를 정의하는 보일러 플레이트가 실제 코드를 압도하고 있다면, 클래스 정의에서 인라인으로 정의하지 않을까요? 네, 일반적으로 나쁜 스타일이라고 생각하는 사람들도 있지만,이 가이드 라인의 목적은 코드를보다 읽기 쉽게 만드는 것입니다. 반대의 효과가있는 경우 무시하십시오.

당신은 더 나은 코드 조직에 대한 .hpp 파일의 끝 부분에 포함됩니다 별도의 .ipp 파일의 구현을 유지하려는 경우에도 중간에 .ipp을 포함하여 그것을 변경할 수 있습니다

foo는. HPP :

template <class a, class b ... class x> 
class foo { 
    #include "foo_impl.ipp" 
}; 

foo_impl.ipp : 어느 쪽의 경우

void function1() {} 
void function2() {} 

그 아이디어는 당신에게 호소력이 있습니다. typedef 나 template alias가 도움이 될 수있는 방법은 없습니다. 그 이유는 그것이 템플릿의 전문화에 이름을 부여하기 때문입니다. 당신이 무엇을 하든지간에, 여전히 무료 인 템플릿 매개 변수는 여전히 나열되어야합니다. 그렇지 않으면 컴파일러는 여러분이 말하는 것을 알지 못할 것입니다.

하지만 당신은 항상 전처리 사용할 수 있습니다 : 당신이 통과 할 필요가 없습니다 두 매크로로 휴식 수정할 수있는 방법이 많이 있습니다

#define FOOMETHOD(rettype) template<class a, class b ... class x> \ 
          rettype foo<a, b, ..., x> 

FOOMETHOD(void)::function1() { } 
FOOMETHOD(void)::function2() { } 

매크로의 ::이-넣어 rettype, 각 유형에 대해 다른 매크로 정의 등. 유스 케이스에 가장 적합한 것으로 보이는 것이 무엇이든, 그렇게하십시오.

0

C++에서는 문제에 직접적인 해결책이 없기 때문에 여기에 머물러 있습니다. 당신은 매개 변수를 입력하지 않아도, 또는 정책 클래스로 모든 종류의 팩을 인라인 함수를 정의 할 수 있습니다 :

struct Policy1 
{ 
    typedef int B; 
    typedef double B; 
    typedef Foo C; 
}; 

template<class Policies> 
void foo<Policies>::function1() { } 

foo<Policy1> FooObject; 

많은 템플릿 매개 변수와 내가보기 엔 이중 검사 및 설계를 트리플 검사를 제안 말했다 모든 . 모두 매개 변수는 실제로 서로 독립적으로 달라야합니까? 그렇다면 수백 또는 수천 개의 클래스를 인스턴스화 할 수 있습니다.

+0

그는 템플릿 매개 변수에 따라 다른 것을 인스턴스화하지 않고 단순히 템플릿 클래스 멤버 함수를 정의하는 것입니다. –

+0

@MooingDuck : 우리는 그가 매개 변수를 사용하고 있는지 정확히 알지 못합니다. 따라서이 정책 클래스를 부르는 것이 부적절 할 수도 있습니다. 그러나 그 경우에도 아이디어는 똑같이 작동합니다. – abarnert

관련 문제