2010-04-04 2 views
5

두 개체의 템플릿 매개 변수가 런타임에 동일하면 주어진 개체에서 새 개체를 만들 수있는 방법이 있습니까? 예를 들어 :C++ 템플릿 클래스 및 복사 구성

나는 선언 템플릿 클래스가 : 지금, 멤버 함수 등을 기록 할

template class Object<char, int>; 
template class Object<wchar_t, wint_t>; 

:

template<typename _Type1, typename _Type2> class Object; 

다음, 나는 템플릿이 인스턴스화가 로 :

template<typename _Type1, typename _Type2> 
Object<char, int> Object<_Type1, _Type2>::toCharObject() { 
    if(__gnu_cxx::__are_same<_Type1, char>::__value) 
     return *this; 
    else { 
     //Perform some kind of conversion and return an Object<char, int> 
    } 
} 

나는 그런 __gnu_cxx::__enable_if<__gnu_cxx::__are_same<_Type1, char>::__value, _Type1>::__type을 사용하는 등 기술의 몇 가지를 시도했다 Oject 클래스의 복사 생성자에,하지만 오류로 실행 계속 :

error: conversion from ‘Object<wchar_t, wint_t>’ to non-scalar type ‘Object<char, int>’ requested 

내가이 작업을 수행 할 수있는 방법이 있나요? 어떤 도움이라도 대단히 감사하겠습니다!

+2

템플릿 유형 이름이 잘못되었습니다. Underscore와 대문자로 된 식별자는 ** 구현에서 사용하도록 예약되어 있습니다 **. 컴파일러 나 표준 라이브러리에 정의 된 이름과 충돌 할 수 있습니다. – jalf

+0

@jaif : typename에 대해 많은 걱정하지 마십시오. 방금 모범을 보았습니다. 내 모든 코드는 실제로 다른 네임 스페이스에 정의되어 있으므로 충돌이 없어야합니다. – themoondothshine

+3

네임 스페이스는 문제 유형 이름이 아닙니다. 예를 들어 _Type1은 모든 상황 (예 : 매크로 일 수 있음)에 예약되어 있으며이 경우 구현에서 사용되지 않을 수 있습니다. 아니면 게시 한 내용이 문제의 원인이되는 실제 코드가 아니라고 말하는 것입니까? 글쎄, 그러지 마. –

답변

4

작동해야하는 것은 컴파일러가 유형이 동일하지 않아도 컴파일러가 return *this 부분에서 유형 검사를 수행한다는 것입니다 (따라서 컴파일 오류). return (Object<char, int>)(*this);을 사용하면 괜찮을 것입니다. 코드가 실행되는 유일한 시간은 형식이 동일 할 때 뿐이므로 캐스트가 컴파일 오류를 해결하는 것 외에는 아무 것도하지 않습니다.

template <class _Type1, class _Type2> 
Object<char, int> toCharObject(Object<_Type1, _Type2> obj) 
{ 
    // Do conversion and return 
} 

// Specialisation when types are equal 
template <> 
Object<char, int> toCharObject(Object<char, int> obj) 
{ 
    return obj; 
} 

이것은 당신이 볼 수있는 무료 기능은 다음과 같습니다

또는, 템플릿 특수화를 사용할 수 있습니다. 멤버 함수로 할 수는 있지만 개별 멤버 함수를 전문화 할 수 없기 때문에 더 까다 롭습니다. 전체 클래스를 전문화해야합니다. 비 특화된 코드를 인수 분해함으로써 그 문제를 해결할 수는 있지만, 이것은 정말로 추악한 일이며, 이것은 마찬가지로 효과가 있습니다.

+0

@Peter : 머리에 못을 박았다 !! 나는 템플리트 전문화를 더 일찍 생각해야했는데 ... 나는 이미 아주 자주 사용했다. Duh !!! 엄청 고마워! – themoondothshine

+0

@ 피터 : ...하지만 어떻게 든 캐스팅을 작동시킬 수 없습니다. 그것을 캐스팅하려고하면 컴파일러에서 "오류 : 유효하지 않은 캐스트"를보고합니다. – themoondothshine

+0

다음과 같이 동작합니다 :'return Object (* reinterpret_cast *> (this))' – themoondothshine