Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个C++;模板类代码工作?_C++_Templates_Googletest - Fatal编程技术网

C++ 这个C++;模板类代码工作?

C++ 这个C++;模板类代码工作?,c++,templates,googletest,C++,Templates,Googletest,我正在尝试将Google Test()代码移植到VxWorks 5.5。严重的缺点是开发环境Tornado 2.2使用古老的GCC编译器版本2.96 在分析代码时,我在gtest.h中找到了部分代码,我不明白!这个C++模板类是如何运行的?< /P> // ImplicitlyConvertible<From, To>::value is a compile-time bool // constant that's true iff type From can be implicit

我正在尝试将Google Test()代码移植到VxWorks 5.5。严重的缺点是开发环境Tornado 2.2使用古老的GCC编译器版本2.96

在分析代码时,我在
gtest.h
中找到了部分代码,我不明白!这个C++模板类是如何运行的?< /P>
// 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
};
当然,这个代码编译得很好(在微软Visual C++ 7.1或更新或GCC 3.4或更新版下),谷歌的人知道他们在做什么。
请开导我!不理解这段代码会让我发疯的!:)

这是模板编程的标准技巧

请注意,注释中说“通过检查Helper(x)的大小”:这强调了代码对
Helper
所做的唯一事情是对某些
x
进行评估
sizeof(Helper(x))
。运算符实际上不计算其参数(它不需要计算;它只需要找出它有多大,这可能只使用编译时可用的信息),这就是为什么没有链接器错误(
Helper
从未真正调用)

给您带来麻烦的语法意味着
Helper
是一个函数,它接受任意数量和类型的参数,并返回对
char[2]
的引用。要为这种类型的函数(a)编写签名,需要使用省略号(
)作为最后一个参数的规范

变量函数是从C继承的一种特性,通常应该避免使用,并且在与类类型一起使用时会造成严重破坏,但在这种情况下,这并不重要,因为正如前面提到的那样,
Helper
实际上不会被调用

类通过允许您使用语法将这一切联系在一起

ImplicitlyConvertible<From, To>::value
隐式convertible::value
要生成
,代码“伪造”调用
助手
,并将
实例作为参数“”传递给它。它依赖于编译器的重载解析来确定在这种情况下是否会调用将
转换为
的重载;如果是这样,则该重载的返回值为
char
,其保证大小为
1
value
最终为
true
。否则,将选择变量重载(可以接受任何类型的参数),它将返回一个
char[2]
。其大小大于
1
,因此
结束


请注意,这里再次使用了“
sizeof
实际上并没有计算表达式”技巧:如何告诉编译器
Helper
的参数是来自
的实例?您可以使用
From()
,但是
From
需要有一个默认的公共构造函数来编译代码。因此,您只需告诉编译器“我有一个函数
MakeFrom
,它返回一个
From
”——该函数实际上不会被调用

ImplicitlyConvertible<From, To>::value