템플릿 기반 명시 적 캐스트 연산자를 시도하고 있습니다. 나는 표기법으로 연산자의 "이름"슬롯에 타입 특성과 std::enable_if
이라는 표현식을 실제로 넣을 수 있음을 알았습니다.명시적인 템플릿 캐스트 연산자의 enable_if가 "invalid static_cast"를 제공합니다.
#include <iostream>
#include <type_traits>
class WillCast {
public:
explicit operator int() {
return 1020;
}
};
class WontCast {
public:
template <typename T>
typename std::enable_if<
std::is_same<T, int>::value, int
>::type toInteger()
{
return 1324;
}
template <typename T>
explicit operator typename std::enable_if<
std::is_same<T, int>::value, int
>::type()
{
return 304;
}
};
int main() {
std::cout << static_cast<int>(WillCast{}) << "\n"; // ok
std::cout << WontCast{}.toInteger<int>() << "\n"; // ok
/* std::cout << static_cast<int>(WontCast{}); */ // error
};
GCC 4.8.2에서 돌아 오는 오류는 다음과 같습니다 :하지만 다음 테스트는 원하는 동작을 제공하지 않습니다
test.cpp: In function ‘int main()’:
test.cpp:27:45: error: invalid static_cast from type ‘WontCast’ to type ‘int’
std::cout << static_cast<int>(WontCast{});
난 할 노력하고있어 불가능했던 경우에, 나는 놀라지 않을 것이다. 그러나 구문이 괜찮다고 생각하는 것 같습니다. WontCast::toInteger()
과 WillCast::operator int()
에 의해 나타나는 "근처"동작간에 일관되게 동작하는 것처럼 보이지 않습니다.
(이것은 물론 내 enable_if
이 까다 롭습니다 원하는 감소 된 예입니다.)
UPDATE - "사이드 바 인텔리전스 (TM)는"How can I use std::enable_if in a conversion operator?을 던졌다 내가 찾을 수 없습니다 "예전의 유익한 지능 (tm)"을 통해 나는 그것이 도움이되는지보고 볼 것이다. 음, WontCast가 템플릿 클래스가 아니기 때문에 거기에 사용 된 솔루션이 적용되지 않는 것 같습니다. 그래서 여기 돕는 게 아닙니다. 템플릿에 enable_if
부분을 이동하면
무엇에 대한 [전문] (http://coliru.stacked-crooked.com/a/3f860354bf54a365)? –
@remyabel 그 특별한 경우에는 작동하지만, 그 특정 사례가 내가 찾고있는 것이라면 WillCast와 함께 가서 "int"라고 말할 수 있습니다. 패턴 매칭을 수행하고 많은 캐스팅 연산자를 생성하는 무언가를 찾고 있습니다 ...하지만 올바른 경우에만 발생합니다. – HostileFork
[this] (http://coliru.stacked-crooked.com/a/104248a4014efff6) 어때요? 질문에있는 링크와 동일한 트릭을 사용합니다. –