일부 코드를 디버깅하는 동안 복잡한 유형의 객체 값을 텍스트 파일에 덤프하여 클래스와 작동하는 경우를 비교할 수있는 클래스를 만들었습니다. 그렇지 않습니다. 나는 (베어 예로 감소)이 같은 클래스를 구현 :자동 템플릿 유형 공제 복잡한 포인터 및 참조
#include <iostream>
class someOtherClass
{
public:
someOtherClass()
: a(0)
, b(1.0f)
, c(2.0)
{}
int a;
float b;
double c;
};
class logger
{
public:
// Specific case for handling a complex object
logger& operator << (const someOtherClass& rObject)
{
std::cout << rObject.a << std::endl;
std::cout << rObject.b << std::endl;
std::cout << rObject.c << std::endl;
return *this;
}
// [other class specific implementations]
// Template for handling pointers which might be null
template< typename _T >
logger& operator << (const _T* pBar)
{
if (pBar)
{
std::cout << "Pointer handled:" << std::endl;
return *this << *pBar;
}
else
std::cout << "null" << std::endl;
return *this;
}
// Template for handling simple types.
template< typename _T >
logger& operator << (const _T& rBar)
{
std::cout << "Reference: " << rBar << std::endl;
return *this;
}
};
int main(int argc, char* argv[])
{
logger l;
someOtherClass soc;
someOtherClass* pSoc = &soc;
l << soc;
l << pSoc;
pSoc = nullptr;
l << pSoc;
return 0;
}
나는 다음과 같은 출력을 얻기 위해 기다리고 있었다 :
0
1
2
Pointer handled:
0
1
2
null
하지만 실제로 얻을 것은 :
0
1
2
Reference: 010AF7E4
Reference: 00000000
을
자동 구현 유형 공제가 참조 구현을 선택하고 포인터 구현을 선택하는 대신 유형을 someOtherClass*
으로 설정하는 것 같습니다. 이 때문에 필요
template< typename _T , typename = typename ::std::enable_if_t<!std::is_pointer<_T>::value> >
logger& operator << (const _T& rBar)
{
std::cout << "Reference: " << rBar << std::endl;
return *this;
}
: 내가 제대로이 템플릿을 사용하기 위해서, 그래서 포인터 유형이 될 수 logger& operator << (const _T& rBar)
유형 T
에서 비주얼 스튜디오 2012
당신은 [mcve] –
@PasserBy 필요합니다 제공 한 코드가 자체 포함하고 그것은 완전하고 검증 가능하지만, 최소한 아닌 @Mat 문제 – Mat
을 재생합니다. 이것은 약간 까다롭게 들리지만 솔직히 그것이 모든 관계자들이 소비 한 시간을 줄이는 데 도움이된다고 생각합니다. 문제를 최소한으로 줄이는 저자는 다른 사람보다 빠릅니다. –