为什么不能用明显不同的签名之一重载此函数?
Why can't this function be overloaded with one of clearly different signature?
由于error: redefinition of ‘template<class Integer, class> void func(Integer)’
#include <iostream>
#include <type_traits>
template<typename Float, typename = typename
std::enable_if<std::is_floating_point<Float>::value>::type>
void func(Float floatVal)
{
std::cerr << "float: " << floatVal << "n";
}
template<typename Integer, typename = typename
std::enable_if<std::is_integral<Integer>::value>::type>
void func(Integer integer)
{
std::cerr << "integral: " << integer << "n";
}
int main()
{
func(32.4246);
func(144532);
}
但是这两个函数在模板实例化时显然有不同的签名。那么为什么不能编译呢?
请注意:我做知道如何解决这个问题:只是添加另一个虚拟模板参数到其中一个函数,例如typename=void
,将工作,像这里
template<typename Integer, typename dummy=void, typename = typename
std::enable_if<std::is_integral<Integer>::value>::type>
void func(Integer integer){}
但问题是为什么我必须这样做? N4527 §1.3.19 [define .signature.templ]
可以将
std::enable_if<...>::type
更改为函数的返回类型。据我所知,你不能把它传递给另一个模板参数的类型。<<p> 生活例子/kbd>#include <iostream> #include <type_traits> template<typename Float> typename std::enable_if<std::is_floating_point<Float>::value>::type func(Float floatVal) { std::cerr << "float: " << floatVal << "n"; } template<typename Integer> typename std::enable_if<std::is_integral<Integer>::value>::type func(Integer integer) { std::cerr << "integral: " << integer << "n"; } int main() { func(32.4246); func(144532); }
或者像NathanOliver那样重载返回类型,你可以在模板类型中更复杂一点:
template<typename Float, typename std::enable_if<std::is_floating_point<Float>::value>::type* = nullptr>
void func(Float floatVal)
{
std::cerr << "float: " << floatVal << "n";
}
template<typename Integer, typename std::enable_if<!std::is_floating_point<Integer>::value && std::is_integral<Integer>::value>::type* = nullptr>
void func(Integer integer)
{
std::cerr << "integral: " << integer << "n";
}
现场演示注意,Integer
的第二个enable_if
显式地否定了Float
的enable_if
条件
这种方法的好处是函数仍然返回void
并测试它:
int main()
{
func(32.4246);
func(144532);
}
输出:float: 32.4246
integral: 144532
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 可以打印矢量和矢量中的矢量的非重载C++函数
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 使用模板重载函数
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 如何从重载解析中删除重载函数?
- CUDA:重载函数"isnan"的多个实例
- C++派生类重载函数(带有 std::function 参数)不可见
- 避免在人为的重载函数调用中拼写出类型
- C++:如何为多个重载函数保留通用代码路径?
- 什么时候可以使用常量装饰调用我的重载函数?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- std::调用,未找到匹配的重载函数
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 如何通过签名作为模板参数来解决重载函数?