这个模板函数是如何工作的?它检查运行时是否可以进行类型转换,而不使用强制转换

How does this template function work? It checks runtime whether type conversion is possible, without using cast

/// Segédsablon típuskonverzió futás közbeni ellenőrzésere
///That translates into: Helper-template to test type conversion during runtime
template <typename F, typename T>
struct _Is_Types {
    template<typename D> static char (&f(D))[1];
    template<typename D> static char (&f(...))[2];
    static bool const convertable = sizeof(f<T>(F())) == 1;
};

这是一个代码片段,用于测试您是否可以将 F 转换为 T(或者我告诉过的),但我不太理解。请帮助我

#Edit1:

所以我必须扩展一个骨架代码,其中一个测试(使用 gtest_lite)看起来像这样:

TEST(Elkeszult0, sanity_check) {
      if (_Has_String<UString>::member == false)
        FAIL() << "No inheritance" << endl;

      if (_Is_Types<UString, String>::convertable == false)
          FAIL() << "UString can't be converted to String!" << endl;
      if (_Is_Types<String, UString>::convertable == false)
          FAIL() << "String can't be converted to  UString!" << endl;
    } ENDM

#Edit2

class String
{
  public: 
};


class UString : public String
{
  public: 
};


template <typename F, typename T>
struct _Is_Types {
    template<typename D> static char (&f(D))[1];
    template<typename D> static char (&f(...))[2];
    static bool const convertable = sizeof(f<T>(F())) == 1;
};

/* First instantiated from: insights.cpp:10 */
#ifdef INSIGHTS_USE_TEMPLATE
template<>
struct _Is_Types<String, UString>
{
  template<typename D>
  static char (&f(D))[1];
  template<typename D>
  static char (&f(, ...))[2];
  
  #ifdef INSIGHTS_USE_TEMPLATE
  template<>
  static char (&f<UString>(, ...))[2];
  #endif
  
  static const bool convertable = sizeof(f<UString>(String())) == 1;
};

#endif

int main()
{
  _Is_Types<String, UString>::convertable;
  return 0;
}

这并没有真正帮助我理解它。那么D型爆成什么呢?它甚至做了什么,放在函数定义之前? “f”是什么?

检查确实在编译时完成。

让我们分析一下每一行的作用。

template<typename D> static char (&f(D))[1];

此行将 f 声明为一个函数,该函数采用 D 类型的参数,并且 return 是对 char[1].

的引用
template<typename D> static char (&f(...))[2];

此行将 f 重载为一个接受任何参数的函数,并且 return 是对 char[2].

的引用
static bool const convertable = sizeof(f<T>(F())) == 1;

最后,评估可兑换性。 f<T>(F()) 尝试使用 F 类型的参数调用 f<T>。如果 F 可转换为 T,则选择第一个重载并且 return 类型为 char(&)[1]。否则,选择另一个重载并且 return 类型为 char(&)[2]。使用 sizeof 运算符,我们确定选择了哪个重载,现在我们知道 F 是否可转换为 T.

请注意,这仅在 F 可默认构造时有效。