2009-09-14 6 views
1

정적 포인터 초기화 ... const 포인터를 사용하여 오버로드 된 템플릿 함수 멤버 함수. 할 수있는 방법이 있습니까 (C++ 03 표준 코드)? 정적 배열이 파일 범위에서 초기화해야하기 때문에
1. 템플릿 매개 변수와 pmfi 내가 템플릿에 액세스 할 알고 전체 자격 (유일한 방법이어야합니다 내가 템플릿 클래스과부하가 걸린 템플릿 멤버 함수에 대한 const 포인터의 정적 배열

 

template <class T1, class U1, typename R1> 
class Some_class { 
public: 
    typedef T1 T; 
    typedef U1 U; 
    typedef R1 R; 

    R operator()(T& v) { /* dereference pointer to a derived class (U), 
          overloaded member function (U::f) */ }; 

private: 
    static R (U::* const pmfi[/* # of overloaded functions in U */])(T&); 
}; 

Used as 

template <class BASE, typename RET> 
class Other_class : public Some_class<BASE, Other_class<BASE, RET>, RET> { 
    RET f(/* type derived from BASE */) {} 
    RET f(/* other type derived from BASE */) {} 
    RET f(/* another type derived from BASE */) {} 
    ... 
}; 

Question: how can I initialize de array pmfi (no typedefs, please)? 

사항이있는 경우, 의미 클래스 범위 밖에있는 매개 변수는 typedef ...).
2. 지금까지 너무 좋아. 컴파일러에 문제 없음 (Comeau 4.3.10.1). {...} 이니셜 라이저 목록을 채울 때 문제가 발생합니다.
2.1. 컴파일러는 필자가 무엇을하든 템플릿 인수 목록이 누락되었다고 불평합니다.
2.2. 올바른 오버로드 된 U :: f 함수를 선택하는 방법을 모르겠습니다.

BTW는 boost.preprocessor 목록에서 "점프 테이블"생성기의 일종입니다. 구현하려는 코드는 당연히 훨씬 더 복잡하지만이 코드는 그의 본질입니다. 당신이 '수'를 받아 적절한 적절한 멤버의 주소 식을 산출하는 매크로를 필요 당신이 표시 한 방법으로 BOOST_PP_ENUM을 사용하려면 어떤 도움

답변

1

에 대한

감사합니다 수업. 원하는 기능의 이름이 모두 제조되지 않으면 (예 : memfun1, memfun2 등) 명시 적 목록없이이 작업을 수행하는 좋은 방법은 없습니다. 이 경우를 제외하고 BOOST_PP_ENUM을 사용하는 명시 적으로 함수 주소 표현식을 명시하는 것이 쉬울 것입니다.

이 배열에서 템플릿 매개 변수와 동일한 식별자를 Some_class에 사용하고 있습니다.

Some_class의 템플릿 멤버가되어야합니까?

template< class T, class U, class R > 
R (U::* const Some_class<T, U, R>::pmfi[])(T&) = { /* ... */ } 

그렇다면, 당신이 템플릿 Some_class으로 우리에게가는 모든 유형의 조합 일 것 같은 인스턴스? 그렇다면 매우 제한된 클래스 세트가 있습니다. 아마도 템플릿을 사용하지 않아도됩니다. 그렇지 않다면 템플릿 매개 변수의 모든 조합에 대해 Some_class을 전문화해야합니다.이 경우 템플릿이 당신에게별로 도움이되지 않습니다.

편집, 게시 편집 : 정확하게 이해했다면 제안하는 것은 할 수 없습니다. 포인터의 배열이 정확히 올바른 서명이어야하기 때문입니다. 간단한 함수 포인터 예에 감소

, 당신은이 작업을 수행 할 수 없습니다

void f(Derived&); 

void (*p)(Base&) = &f; 

를, 그렇지 않으면 형 안전 파괴하는 것입니다 : 함수 포인터의 배열에서

OtherDerived od; // derived from Base, but no from Derived 

// I've managed to pass something that isn't a Derived reference to f 
// without an explicit (and dangerous) cast 
(*p)(od); 

을의 이니셜 라이저는 모두 올바른 서명의 기능이어야합니다.

+0

안녕하세요, Charles 1. 실제로 Boost.preprocessor의 "seq"를 사용하여 BOOST_PP_ENUM을 확장하고 형식 목록 (프로세스에서 사용되는)을 생성합니다. 2. 실제 코드가 아닙니다.코드의 식별자는 템플릿 args의 typedef로 사용해야합니다. R, T, U가 Some_class (나머지는 잊어 버림)의 템플릿 args의 typedef이면 배열 정의는 Some_class :: R (Some_class :: U :: * Some_class :: pmfi []) (Some_class :: T &) = {...}; Q : 어떤 부분의 sintax 여야합니까? A : & Some_class :: U :: f (f로 오버로드 되었습니까?) U가 그 자체가 템플릿이라면, 어떻게 말합니까? Comeau가 내 시도에 동의하지 않습니다. –

+0

U는 Some_class의 템플릿 매개 변수이지만 U가 클래스 템플릿을 나타내는 경우 U :: f 함수의 주소를 작성해야하는 방법은 무엇입니까? & U :: f? 오른쪽으로 오버로드 된 f를 선택하는 방법은 무엇입니까? 알았어. BTW, 심지어 1 elem 배열 (그래서 과부하) comau 컴파일러는 위의 sintax 허용하지 않습니다. –

+0

"실제 코드가 아닙니다." 그런 다음 실제 코드를 게시하고 해결하려는 문제를 설명 할 수 있습니다. 솔루션은 지나치게 복잡해 보이지만 문제가 무엇인지 모른 채 말하기는 어렵습니다. 특히 템플릿 매개 변수 'U'(또는 지금은 'U1'입니까?)와'Types' 및 metafunction 'Length'가 정의 된 곳에 사용할 샘플 클래스를 게시 할 수 있습니까? 포스트 편집을하면,'Some_class :: pmfi'의 선언에 오류가있는 것 같습니다. –

관련 문제