我想通过将enable_if应用于返回类型来选择特定的功能模板。
一个简单的例子是区分有符号和无符号参数。
#include <iostream>
#include <type_traits>
template<typename T>
typename std::enable_if<std::is_signed_v<T>, bool>
foo(T t)
{
return true;
}
template<typename T>
typename std::enable_if<!std::is_signed_v<T>, bool>
foo(T t)
{
return false;
}
int main(){
std::cout << foo<uint32_t>(42) << std::endl;
return 0;
}
在这里我得到编译器错误:call of overloaded ‘foo<uint32_t>(int)’ is ambiguous
std::cout << foo<uint32_t>(42) << std::endl;
我知道如果我使用foo(42)
将会是模棱两可的,因为42可以转换为带符号的无符号。但是,如果像我的示例中那样明确指定tempalte参数,我希望它可以正常工作。
我的代码有什么问题,我该如何解决?
答案 0 :(得分:3)
您::type
的末尾缺少enable_if
,因此即使条件为假,也不会发生错误
您可以使用enable_if_t
或像这样添加::type
typename std::enable_if<std::is_signed_v<T>, bool>::type
答案 1 :(得分:1)
泰克(Tyker)已回答您,您::type
中缺少enable_if
。
通过使用std::enable_if_t
(since C++14)可以减少样板数量
template<typename T>
std::enable_if_t<std::is_signed_v<T>, bool>
foo(T t)
{
return true;
}
template<typename T>
std::enable_if_t<!std::is_signed_v<T>, bool>
foo(T t)
{
return false;
}