2011-12-12 4 views
-4

은 Functor 분열증 : C의 ++에서typename을 저장할 수 있습니까?

, 그 형태를 인식 할 수있는 템플릿 클래스의 인스턴스를위한 방법은 무엇입니까? 예를 들어 클래스 펑터가 있는데,이 클래스 펑터는 두 개의 typename 템플릿 매개 변수를 사용합니다. 하나는 함수의 반환 유형이고 다른 하나는 매개 변수 유형입니다. 이 두 가지 유형을 모두 저장하는 방법을 원합니다. 따라서 나중에 유형을 전달하지 않고 나중에 펑터를 쉽게 사용할 수 있습니다.

이유 :

나는 이러한 펑터을 모두 저장하고 싶은 스레드 풀 클래스가, 그리고 기능의 하나 개 이상의 유형을 처리 할 수 ​​있도록하고 싶습니다. 그래서 나는 나중에 함수를 호출 할 수 있도록 함수의 타입을 알아야한다고 생각합니다. 템플릿을 기반으로하지 않는 클래스에 저장하는 동안 (물론 set_function/set_parameter 메소드는 예외입니다).

당신은 템플릿 유형에 대한 형식 정의를 만들 수 있습니다
+0

자세한 정보를 알려주세요. 템플릿은 컴파일 타임 구조이며,'void *'는 적어도 당신이 묻고 있다고 생각하는 의미에서 실행 시간에 더 가깝습니다. 무엇을 성취하려고합니까? – Thanatos

+0

나는 당신이 성취하려는 것을 확신하지 못하지만'typedef'만으로는 충분하지 않겠는가? –

+0

명확하지 않은 점에 대해 사과드립니다. 이것이 자정 이후에 질문해서는 안됩니다. 대답은 중요하지 않습니다. 스레드 풀을 만들고 있습니다. 템플릿이있는 인스턴스가 자체 유형을 알고 있을지 궁금합니다. – ultifinitus

답변

2

, 뭔가 같은 :

template <typename T> 
class X { 
    typedef T value_type; 
}; 

그리고은과 같이 유형을 참조 할 수 있습니다 :

void* p = /* some initialization to an X<int>::value_type */; 
X<int>::value_type* x = static_cast<X<int>::value_type*>(p); 
0

난 당신이 무슨 일을하는지 추측이 있다면/네가 원한다면, 이런 식으로 될거야. (이 오히려 당신이 원하는 말 것보다 당신이 실제로이 원하는 것을 추측에 믿음의 완전한 도약을 수 있습니다.)

이 개념
class interface { 
public: 
    virtual std::unique_ptr<interface> create() const =0; //virtual "constructor" 
    virtual bool is_same_type(const interface* ptr) const =0; //type comparison 

    virtual void func() =0; //function 
    virtual ~interface() {} 
}; 

template<class T> 
class instantiation : public interface 
{ 
public: 
    virtual std::unique_ptr<interface> create() const 
    { return std::unique_ptr<interface>(new instantiation()); } 
    virtual bool is_same_type(const interface* ptr) const 
    { return dynamic_cast<instantiation*>(ptr) != NULL; } 

    virtual void func() {} 
    virtual ~interface(){} 
}; 

, 당신은 컨테이너 스토어를 interface의를 확인하고 있습니다 " 같은 템플릿으로 새 인스턴스를 만들 정도로 충분히 유형을 기억하고 템플릿이 다른 템플릿과 같은지 비교해보십시오.

(전화 텍스쳐를 적절한 C++로 번역 해 주셔서 감사합니다)

+0

전화에 많은 코드를 어떻게 작성합니까? 그건 마치 PITA 같아. –

+0

@Johannes : 그것은 ... * 작동합니다. 하지만 맞춤법 교정은 성가신 일입니다. 특히 새로운 라인의 시작 부분에 자동적 인 후자. 자비 롭게, 몇몇 전화는 당신을 저것을 무능하게한다. | 'create' 함수에'const'를 추가 했으므로 인스턴스 데이터를 변경할 필요가 없습니다. – Xeo

+0

그래, 두 공간을 넣을 때마다 다음 단어를 "std :: vector "으로 "유용하게"삽입하므로 좋은 20 분이 소요되었습니다. (아, 저도 "물건"을 추측했습니다!) –

관련 문제