SFINAE 函数重载
SFINAE function overload
我想问一下使用 SFINAE 进行函数重载的问题。我定义了 2 个函数,其中一个应该在整数类型作为参数传递时使用,另一个应该在浮点型作为参数传递时使用。这是代码:
template <typename T, typename If<IsIntegral<T>::value,T>::Type = 0>
void function(T t) {
std::cout << "T is integral type" << std::endl;
}
template <typename T, typename If<IsReal<T>::value,T>::Type = 0>
void function(T t) {
std::cout << "T is real type" << std::endl;
}
这编译得很好。当我实例化完整版本的函数时,像这样:
function(4);
function(28l);
它仍然可以正常工作(我收到消息 "T is integral type")。但是,当我为浮点类型添加另一个实例时:
function(4);
function(28l);
function(4.5f);
我收到错误提示,没有匹配的函数可以调用 "function(float)"。这段代码有什么问题?顺便说一下,If 模板 class 只是 enable_if.
的别名
嗯,您不能将 float
类型的常量作为模板参数。
尝试 class=typename If<IsRead<T>::value,T>::Type
并在其他情况下将其作为第一关。
如果您有 C++11,请尝试使用 using
别名来摆脱 typename
垃圾邮件。此外,在发布寻求帮助的问题时,更喜欢 std::enable_if<?>
而不是 If<?>
,因为我不得不 猜测 If
做了什么(据我所知,您真正的问题在于您对 If
和 IsReal
等的实施)。
我想问一下使用 SFINAE 进行函数重载的问题。我定义了 2 个函数,其中一个应该在整数类型作为参数传递时使用,另一个应该在浮点型作为参数传递时使用。这是代码:
template <typename T, typename If<IsIntegral<T>::value,T>::Type = 0>
void function(T t) {
std::cout << "T is integral type" << std::endl;
}
template <typename T, typename If<IsReal<T>::value,T>::Type = 0>
void function(T t) {
std::cout << "T is real type" << std::endl;
}
这编译得很好。当我实例化完整版本的函数时,像这样:
function(4);
function(28l);
它仍然可以正常工作(我收到消息 "T is integral type")。但是,当我为浮点类型添加另一个实例时:
function(4);
function(28l);
function(4.5f);
我收到错误提示,没有匹配的函数可以调用 "function(float)"。这段代码有什么问题?顺便说一下,If 模板 class 只是 enable_if.
的别名嗯,您不能将 float
类型的常量作为模板参数。
尝试 class=typename If<IsRead<T>::value,T>::Type
并在其他情况下将其作为第一关。
如果您有 C++11,请尝试使用 using
别名来摆脱 typename
垃圾邮件。此外,在发布寻求帮助的问题时,更喜欢 std::enable_if<?>
而不是 If<?>
,因为我不得不 猜测 If
做了什么(据我所知,您真正的问题在于您对 If
和 IsReal
等的实施)。