std :: enable_if를 사용하여 다양한 유형의 함수를 특수화하려고합니다.
여기 내가 수행하려고하는 것의 더 단순한 버전이 있습니다. 컴파일 할 때std :: enable_if 사용
#include <type_traits>
#include <string>
struct Ip
{};
template <typename T>
bool Equal(const std::string& s, const T& data)
{return s == data;}
template <typename T>
bool Equal(const std::string& s, const typename std::enable_if<std::is_integral<T>::value, T>::type& data)
{
//int specific
}
template <typename T>
bool Equal(const std::string& s, const typename std::enable_if<std::is_floating_point<T>::value, T>::type& data)
{
//Float specific
}
//Specialization
template <> bool Equal(const std::string& s, const Ip& data)
{
//Ip specific
}
int main()
{
//Equal("21",21); // Do not compile
Equal("21","42.5"); // Compile
}
하지만, 표준 : enable_if와 템플릿 기능은 해상도에 참여하지 않는 것, 그래서 컴파일러는 내 함수 호출을 일치하는 기능이 없다는 것을 알려줍니다. 반환 유형으로 std::enable_if
을 사용해 보았지만 거기에는 행운이 없습니다. 나는이 코드에서 내가 몹시 잘못하고있는 일이있을 것이라고 확신한다. 그렇지 않으면 잘못된 방향으로 시도하려고한다.
나는 모든 int 특성화 (int, short, long, long long, ...)를 쓰려고하지 않으므로 누구나이 솔루션을 사용할 수 있습니까?
는 생각 http://www.gotw.ca/publications/mill17.htm – Slava
@Slava : 그는 템플릿을 사용하려고 시도하지 않는 것 전문화. –
@Slava : 마지막 경우에 대한 좋은 링크 ('Ip'에 대한 전문화), 그러나 다른 경우에는 다른 문제가 있습니다. – Jarod42