假设我有一个功能模板:
template <typename T>
std::string foo(const T& x)
{
return some_computation_involving(x);
}
如果x
已经是一个字符串,我只想逐字传回。我应该专门化功能模板吗?
template <>
std::string foo(const std::string& x)
{
return x;
}
或者我应该提供非模板功能吗?
std::string foo(const std::string& x)
{
return x;
}
在什么情况下我应该选择哪个选项,以及我需要注意哪些陷阱?
答案 0 :(得分:5)
Herb Sutter 表示,首选功能专业化过载。他在文章中解释了这一点:
答案 1 :(得分:3)
如果可以,请务必选择过载。功能模板专业化是一个善变的婊子。例如,在决定专业化时,不会考虑隐式转换,包括协方差。
编辑:例如,如果您执行类似的操作,
template<typename T> void func(T t);
template<> void func(base*);
int main() {
func(new derived);
}
不会调用专业化。如果它是一个重载,它将被调用。