2011-12-21 3 views
3

런타임에 변수에서 사용할 수있는 데이터 형식을 사용하여 템플릿 클래스를 인스턴스화하려고합니다. C++에서 변수에서 템플릿 인수 지정

template <typename T, unsigned int U> 
class Allocator 
{ 
public: 
    T * pointer; 
    Allocator() { pointer = new T[U]; } 
    ~Allocator() { delete [] pointer; } 
}; 

지금 나는이처럼 사용하려면 :이 일을 어떤 방법

int main() 
{ 
    string temp = "int"; 
    unsigned int count = 64; 
    Allocator<temp, count> a; 
    return 0; 
} 

거기에 예를 들어,이 클래스를 고려?

기본 포인터로 파생 클래스를 serialize하는 컨텍스트에서이 문제가 발생합니다. RTTI를 사용하여 파생 클래스의 실제 유형을 식별하지만 실제 유형의 정보는 문자열에 저장됩니다. 내 문제는 기본 포인터에서 유형 (런타임에 문자열로 사용 가능)에 dynamic_cast 수 있습니다. 도와주세요.

+0

U가 생성자의 매개 변수 대신 템플릿 매개 변수 여야하는 이유가 있습니까? –

+0

위의 내용은 실제 문제의 예입니다. 이 특별한 경우에 U를 생성자 인수로 삼아 해결할 수 있지만 실제로 문제를 해결하기 위해 예제로 사용했습니다 ... – Somesh

답변

1

수 없습니다. 데이터 유형은 컴파일시 알려 져야합니다. 어쩌면 부스트 나 유니온을 사용하는 것이 비정상적으로 문제를 해결할 수도 있습니다.

행운을 빈다.

+0

내가 생각 해낸 방법 중 하나는 프로토 타입 패턴. 조회 테이블이 모든 가능한 유형의 할당 자 (실제로 응용 프로그램에서 사용됨)에 대해 존재하는 경우 문자열 (테이블의 "키")로 사용할 수있는 데이터 유형을 사용하고 적절한 할당자를 "복제"합니다 포인터는 테이블의 키에 대한 "값"입니다). 그러나이 방법을 사용하면 여전히 Allocator 의 포인터를 등록해야합니다. XXX는 가능한 모든 크기를 한 번에 하나씩 스윕합니다. 이 문제를 방지하는 해결 방법은 무엇입니까? – Somesh

+0

좋아요, 이것에 대해 좀 더 생각한 후에, 왜 이것이 _ 할 수 없는지 이해할 수 있습니다. 템플릿을 기반으로하는 코드 생성이 * 컴파일 타임 활동 *이라는 사실이 이유입니다. 컴파일러는 컴파일 타임에 변수의 내용을 알지 못하므로 템플릿이 인스턴스화 될 때 생성 할 코드를 파악할 수 없습니다. 제안에 대한 많은 감사의 말을 전합니다. – Somesh

+0

여러분 환영합니다. 행운을 빌어 요;) – Drewen

1

C++에서 반사 메커니즘이 없으면 직접 언어를 지원하는 데이터를 기반으로하는 "동적 생성"이 실제로 불가능합니다.

유일한 방법은 유형을 선언하는 문자열을 생성 함수 호출과 연관시키는 디스패치 맵을 소유 한 팩토리 클래스와 같은 "스위치"또는 이와 동등한 선언적 메커니즘을 사용하는 것입니다.

+0

그게 제가 생각해 봤던 것입니다. (Drewen의 대답에 대한 저의 코멘트를보십시오). 그러나 문제는 주어진 데이터 유형에 대해 'int'라고 말하면 가능한 모든 크기의 Allocators에 대한 포인터를 맵에 저장해야한다는 것입니다. 이걸 자동화하는 방법이 있었으면 좋겠어. – Somesh

+0

의미는 키로'int'를 저장하고 값으로 다른 맵을 저장하는지도를 가지고 있습니다. 두 번째 (value) 맵에서 키는 크기 (예 : 64)이고 값은 실제 할당 자 ('Allocator *')를 가리키는 포인터입니다. 이제는 복제하기가 쉽습니다. 반대로, 두 번째 (값) 맵에는 가능한 모든 크기 (또는 가능한 최소한 프로그램에서 사용되는 크기)에 대한 할당 자 포인터가 있어야합니다. – Somesh

+0

@Somesh : 나는 너무 복잡하지만 의미 상 동등하다고 느낍니다. 이것은 (더 분명히 표현 된) 선언적 구조들에 지나지 않습니다. 편안하게 느끼면 ... 왜 안되나요? –