何时将模板参数类型约束到具体类

时间:2013-04-27 11:41:48

标签: c++ templates

如果我有一个可以为所有类型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;
}

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

2 个答案:

答案 0 :(得分:2)

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

因此,尽可能使您的功能模板尽可能通用,但不要超出需要。在这种情况下,你的努力最好投入其他事情。

答案 1 :(得分:1)

模板优于限制类型的优点是,如果给定类型支持函数需要对参数执行的操作,则函数可以正常工作。这也称为“鸭子打字”。

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

另一方面,当你期望一种不能用“鸭子打字”表达的类型的特定行为时,你不想要这个的好例子(即严格类型的优点),例如如果您的函数要求a += ba = a + b相同(尽管如果重载运算符,此 应始终保持不变),或者当特定(和想要的)副作用发生时在类型上调用函数。但是,这些“要求”可以(并且通常)在您的函数的文档(注释)中表示,例如(“T::size()应该返回...的数量。”)。

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