【发布时间】:2018-08-21 21:28:42
【问题描述】:
是否可以为不同的集合类型创建具有不同行为的函数模板?
假设一个带有模板参数的函数,它应该接受 ANY 类型,并且没有编译失败
template<typename T>
void foo(T arg){
std::cout << arg;
}
当然,这不会为没有operator<< 的类型编译。我只想在std::cout 中写幼稚的类型(即数字、std:string、const char *),对于其他类型,没有什么可以打印出来的。
所以,我尝试了这个(为简化起见,我省略了对std:string、const char * 的检查)
template<typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type>
void foo(T arg){
std::cout << arg;
}
template<typename T, typename = typename std::enable_if<!std::is_arithmetic<T>::value, T>::type>
void foo(T arg){
}
也就是说,必须生成没有潜在歧义的重载函数。当然,代码不会编译,因为模板的参数不是模板签名的一部分(因此有两个具有相同签名的模板)。那么有什么办法可以玩吗?
我看到了将后一个函数作为主模板的解决方案,并为声明的类型创建模板专业化,但我不想用相同的定义来膨胀我的代码(并且可能有更多类型的打印)。有没有什么方法可以使用std::enable_if 或 smth 来专门化函数模板?
附:升压无关紧要 附言我已经看到了这个答案Specialize Many Templates for a Set of Types,但我不知道如何采用它,即所有可能的类型都可以传递给函数,而不仅仅是几个预定义的
【问题讨论】:
标签: c++ c++11 templates sfinae