char Stock_Base::GetHeaderValue<char>(int n)
{
VARIANT pVarResult; VariantInit(&pVarResult);
pdisp->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disparg1, &pVarResult, NULL, NULL);
return pVarResult.cVal;
}
short Stock_Base::GetHeaderValue<short>(int n)
{
VARIANT pVarResult; VariantInit(&pVarResult);
pdisp->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disparg1, &pVarResult, NULL, NULL);
return pVarResult.iVal;
}
int 하나 전달받는 함수인데
리턴값이 char long int wstring 이렇게 되는데
char - return pVarResult.cVal;
long - return pVarResult.lVal;
int - return pVarResult.iVal;
wstring - return pVarResult.bstrVal;
이렇게 바뀌는데
이거 템플릿어떻게 적용함?
GetHeaderValue<char>(x)
했을때 함수안에서
return pVarResult.cVal;
실행하도록 할 수 있나?
cVal 기분 나쁘다
std::is_same 으로 템플릿으로 넘어온 타입이 int 랑 같은지 char랑 같은지 체크하고 니가 원하는걸 넘겨줘 근데 이게 될지 모르겠네
안될것 같다ㅇㅇ 그냥 오버로딩해서 쓰는게 답
욕해서 안알랴줌 ㅇㅇ
당근 할수 있음. 힌트는 "템플릿 명시적 특수화(explicit specialization of template)". 물론 이것만으론 너무 모호하니 코딩 키워드를 하나 더 알려주자면 template<>
그거 이미 쓰고있는데 코드 사이즈 줄어드는것도 아니고 ㅈ같아서 여기다 물어봄
사실 저렇게 쓰는게 정석이긴 한데 편법이 있긴 해. 현행 VARIANT는 사실 멤버들이 union으로 관리되는 단일변수라는 점에 착안해서 그냥 return *(T*)&pVarResult.llVal; 해버리면 됨. 물론 wstring으로 받을 땐 이 아니라 로 해야하는게 주의점이지. 현재로선 성능저하고 없고 너가 말한 코드 크기도 줄일 수 있지. 근데 추후 마소가 VARIANT구조체의 형식을 union이 아닌 다른 무언가로 바꾸게 되거나 하는 상황에서는 오동작 가능성이 생기는게 리스크지. 뭐 모든 비정석적 방법들이 가지는 리스크겠지만.
중간에 문장이 깨졌나 "wstring으로 받을 땐 <wstring> 이 아니라 <bstr>로" 이부분 다시 적음