这个模板函数是如何工作的?它检查运行时是否可以进行类型转换,而不使用强制转换
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
可默认构造时有效。
/// 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
可默认构造时有效。