如果CStringT
继承自CSimpleStringT
,并且CSimpleStringT
的类定义如下,则根据CSimpleString
Documentation:
template<typename BaseType>
class CSimpleStringT
CSimpleStringT
怎么会有两个模板参数呢?它们是否都是相同的BaseType
参数,使得template<typename BaseType, class BaseType> class CSimpleStringT
?
从CStringT
Documentation:
template<typename BaseType, class StringTraits>
class CStringT :
public CSimpleStringT<BaseType,
_CSTRING_IMPL_::_MFCDLLTraitsCheck<BaseType, StringTraits>::c_bIsMFCDLLTraits>
1条答案
按热度按时间8yparm6h1#
C++中的类(和函数)模板是特殊的,因为在示例化时需要知道它们的整个定义。这使得隐藏任何实现细节几乎是不可能的。CSimpleStringT的文档试图通过省略模板的非类型参数来弥补这一点,该参数严格来说是一个实现细节。
真正的类模板声明(在 atlsimpstr.h 中)是:
实际上有两个模板参数(第二个具有默认值),客户端代码需要提供不超过两个参数来示例化该类模板。
严格地说,
CSimpleStringT
的存在只是一个实现细节,因为它公开了CStringT继承的一些公共API(如您所知,CStringT使用两个模板参数示例化其基类模板)。CStringT
仍然是一个实现细节,客户端代码从不直接使用它,而是使用两个具体类模板示例之一:CStringW
或CStringA
,分别用于宽字符串和ANSI字符串。这里的要点是:C++类和函数模板功能强大,但却给文档带来了独特的挑战。(如CRTP)根本不会反映在源代码中,因此没有可以放置文档的源位置。大多数时候,您必须在完整的文档和有用的文档之间做出选择。
CSimpleStringT
选择了有用(但不完整),其中CStringT
决定使用完整的(但帮助不大)文档。