2

如果我有一个可以为所有类型定义的函数模板Stream,例如

template<typename Stream>
Stream& foo(Stream& stream)
{
    return stream;
}

将类型限制为具体类有什么好处,例如

template<typename CharT, Traits>
std::basic_istream<CharT, Traits>& foo(std::basic_istream<CharT, Traits>& stream)
{
    return stream;
}

或者作为经验法则,函数/类模板是否应该尽可能通用,即使您有特定的类型?

4

2 回答 2

2

在当前的 C++ 中,我们还没有任何约束或概念,因此您以前的模板接口比需要的更通用,因为它还接受在其接口中不是流的类型。当您调用函数模板并且它被重载时,这将导致容易产生歧义。

所以让你的函数模板尽可能通用,但不要比需要的更通用。在这种情况下,您最好将精力投入到其他事情上。

于 2013-04-27T12:01:27.753 回答
1

模板相对于限制类型的优势在于,如果给定类型支持您的函数需要对参数执行的操作,您的函数就可以工作,仅此而已。这也称为“鸭子打字”。

这对于算术计算尤其适用,然后自动适用于所有实现算术运算符的类型。

另一方面,当您期望无法在“鸭子类型”中表达的类型的特定行为时(例如,如果您的函数requiresa += b相同a = a + b(尽管如果您重载运算符,这应该始终成立),或者在调用类型上的函数时会发生特定的(和想要的)副作用。但是,此类“要求”可以(并且通常)在您的函数的文档(注释)中表达,例如(“T::size()预期返回...的数量”)。

一般的经验法则是:如果您事先知道要在哪些类型上调用该函数,则使用特定类型,例如,如果您已经有一个抽象超类。如果您希望类型集更加“无限制”,请使用模板。

于 2013-04-27T11:55:46.797 回答