我正在尝试将 Google 测试 ( gtest ) 代码移植到 VxWorks 5.5。严重的缺点是开发环境 Tornado 2.2 使用古老的 GCC 编译器版本 2.96。
在分析代码时,我发现部分代码gtest.h
我不明白!这个 C++ 模板类是如何运作的?
// ImplicitlyConvertible<From, To>::value is a compile-time bool
// constant that's true iff type From can be implicitly converted to
// type To.
template <typename From, typename To>
class ImplicitlyConvertible {
private:
// We need the following helper functions only for their types.
// They have no implementations.
// MakeFrom() is an expression whose type is From. We cannot simply
// use From(), as the type From may not have a public default
// constructor.
static From MakeFrom();
// These two functions are overloaded. Given an expression
// Helper(x), the compiler will pick the first version if x can be
// implicitly converted to type To; otherwise it will pick the
// second version.
//
// The first version returns a value of size 1, and the second
// version returns a value of size 2. Therefore, by checking the
// size of Helper(x), which can be done at compile time, we can tell
// which version of Helper() is used, and hence whether x can be
// implicitly converted to type To.
static char Helper(To);
static char (&Helper(...))[2]; // NOLINT
// We have to put the 'public' section after the 'private' section,
// or MSVC refuses to compile the code.
public:
// MSVC warns about implicitly converting from double to int for
// possible loss of data, so we need to temporarily disable the
// warning.
#ifdef _MSC_VER
# pragma warning(push) // Saves the current warning state.
# pragma warning(disable:4244) // Temporarily disables warning 4244.
static const bool value =
sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
# pragma warning(pop) // Restores the warning state.
#elif defined(__BORLANDC__)
// C++Builder cannot use member overload resolution during template
// instantiation. The simplest workaround is to use its C++0x type traits
// functions (C++Builder 2009 and above only).
static const bool value = __is_convertible(From, To);
#else
static const bool value =
sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
#endif // _MSV_VER
};
创建此类的对象时,如果模板类型可隐式转换为模板类型,则名称为布尔变量value
应包含答案。为了得到答案,使用了两个私有函数,并且. 但是这两个函数只在这里声明,我找不到它们的定义。如果不出意外,此实现不应链接。From
To
MakeFrom()
Helper()
我也不明白以下的语法
static char (&Helper(...))[2];
当然,这段代码编译得很好(在 Microsoft Visual C++ 7.1 或更高版本或 GCC 3.4 或更高版本下),Google 的人确切地知道他们在做什么。
请赐教!不理解这段代码会让我发疯!:)