【发布时间】:2014-08-29 12:06:25
【问题描述】:
我正在尝试使用 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
}
但是在尝试编译时,带有 std::enable_if 的模板函数似乎没有参与解析,因此编译器告诉我没有与我的函数调用匹配的函数。我尝试将std::enable_if 与返回类型一起使用,但也没有运气。我确定我在这段代码中做错了什么,或者我试图以错误的方式做到这一点。
我试图不编写每个 int 特化(int、short、long、很长很长,...),那么有人有解决方案吗?
【问题讨论】:
-
我想为什么它不起作用在这里解释gotw.ca/publications/mill17.htm
-
@Slava:他似乎没有尝试使用模板特化。
-
@Slava:最后一个案例的好链接(
Ip的专业化),但其他案例有其他问题。
标签: c++ templates c++11 enable-if