2014-09-06 2 views
0

현재 CLI/C++에서 네이티브 C++ 클래스의 래퍼를 작성하고 있습니다. 나는 지금 약간의 GamePacket 클래스 위에있다. 내 래퍼를 컴파일 할 수 없습니다, 그러나CLI/C++ 함수 오버로드

Packet.Write<Int32>(1234); Packet.Write<byte>(1);

:

public ref class GamePacket 
{ 
public: 
    GamePacket(); 
    ~GamePacket(); 

    generic<typename T> 
    where T : System::ValueType 
    void Write(T value) 
    { 
     this->bw->Write(value); 
    } 
}; 

나는 내 래퍼를 사용하여 C#으로 다음과 같은 함수를 호출 할 수있어 것을 원하는 다음 클래스를 고려 . 오류 :

Error 1 error C2664: 'void System::IO::BinaryWriter::Write(System::String ^)' : cannot convert argument 1 from 'T' to 'bool'

나는 System::String^ 출처 않습니다이 오류를 이해하지 않습니다. Write() 메서드의 많은 오버로드를보고 있는데, CLI/C++은 올바른 메서드를 호출하지 않습니다. 그렇다면 어떻게하면 올바른 메서드를 호출 할 수 있습니까?

참조 MSDN은 : http://msdn.microsoft.com/en-us/library/system.io.binarywriter.write(v=vs.110).aspx

답변

2

템플릿 및 제네릭는 동일하게 작동하지 않습니다.

템플릿을 사용하면 코드가 각 매개 변수 집합에 대해 다시 컴파일되고 결과가 매우 다를 수 있습니다 (다른 지역 변수 유형, 다양한 함수 오버로드가 선택됨). 전문화하면이 이 실제로 강력합니다.

제네릭을 사용하면 코드가 한 번만 컴파일되고 실제로 최종 매개 변수를 알지 못하고 과부하 해결이 수행됩니다. 당신이 Write(value)를 호출 할 때 모든 것을 할 수

  • valueValueType에서 파생 때문에 제약이 불행하게도
  • 를 알려주기 때문에 그래서, 컴파일러가 알고있는 유일한 일이,

    • valueObject^로 변환 할 수 있다는 것입니다 그 정보를 사용하여, 컴파일러는 Write의 오버로드를 찾을 수 없습니다. 당신이 T 등등 int 때, 그리고 TWrite(int)bool 경우는 Write(bool)을 사용할 것으로 예상처럼

      는 것 같습니다. 템플릿은 그렇게 작동합니다. Generics는 그렇지 않습니다.

      옵션은 다음과 같습니다 자신이 반사를 사용하여 과부하를 찾을 BinaryWrite::Write

    • 의 오른쪽 과부하를 선택하는 데 사용할 수있는 고정 인수 유형이 각각의 당신의 방법의

      • 12 개의 사본, 대리자 오른쪽 과부하 일치하게, 그리고 전화를 찾아 올바른 과부하 일치하는 대리자를 만들 수
      • 사용 식 트리 또는 동적 언어 런타임을, 그리고 당신은 그것을 호출
    +0

    빠른 답변 주셔서 감사합니다! 제네릭을 사용할 수없고 다음과 같은 것을 넣을 수는 없나요? if (value-> GetType() == __typeof (float)) {this-> bw-> Write ((float) value); }'(올바른 구문을 모르겠습니다)? – hresult

    +1

    @hresult : 당신은 할 수 있겠지만, 다중 오버로드만큼이나 많은 작업이며, 타입 검사를 잃어 버린다. (인자 타입이리스트에 없다면, 런타임까지 알지 못할 것이다.) 구문은'if T :: typeid == float :: typeid)' –