c++ CString继承

odopli94  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(170)

如果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>
8yparm6h

8yparm6h1#

C++中的类(和函数)模板是特殊的,因为在示例化时需要知道它们的整个定义。这使得隐藏任何实现细节几乎是不可能的。CSimpleStringT的文档试图通过省略模板的非类型参数来弥补这一点,该参数严格来说是一个实现细节。
真正的类模板声明(在 atlsimpstr.h 中)是:

template< typename BaseType , bool t_bMFCDLL = false>
class CSimpleStringT

实际上有两个模板参数(第二个具有默认值),客户端代码需要提供不超过两个参数来示例化该类模板。
严格地说,CSimpleStringT的存在只是一个实现细节,因为它公开了CStringT继承的一些公共API(如您所知,CStringT使用两个模板参数示例化其基类模板)。
CStringT仍然是一个实现细节,客户端代码从不直接使用它,而是使用两个具体类模板示例之一:CStringWCStringA,分别用于宽字符串和ANSI字符串。
这里的要点是:C++类和函数模板功能强大,但却给文档带来了独特的挑战。(如CRTP)根本不会反映在源代码中,因此没有可以放置文档的源位置。大多数时候,您必须在完整的文档和有用的文档之间做出选择。CSimpleStringT选择了有用(但不完整),其中CStringT决定使用完整的(但帮助不大)文档。

相关问题