我应该专攻还是超载?

时间:2011-08-04 17:38:30

标签: c++ templates function overloading template-specialization

假设我有一个功能模板:

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;
}

在什么情况下我应该选择哪个选项,以及我需要注意哪些陷阱?

2 个答案:

答案 0 :(得分:5)

Herb Sutter 表示,首选功能专业化过载。他在文章中解释了这一点:

答案 1 :(得分:3)

如果可以,请务必选择过载。功能模板专业化是一个善变的婊子。例如,在决定专业化时,不会考虑隐式转换,包括协方差。

编辑:例如,如果您执行类似的操作,

template<typename T> void func(T t);
template<> void func(base*);

int main() {
    func(new derived);
}

不会调用专业化。如果它是一个重载,它将被调用。