folly库Conv类型转换源码解析
1,普通类型转换
例子1:
bool boolV = true;EXPECT_EQ(to<bool>(boolV), true);int intV = 42;EXPECT_EQ(to<int>(intV), 42);float floatV = 4.2f;EXPECT_EQ(to<float>(floatV), 4.2f);double doubleV = 0.42;EXPECT_EQ(to<double>(doubleV), 0.42);std::string stringV = "StdString";EXPECT_EQ(to<std::string>(stringV), "StdString");folly::fbstring fbStrV = "FBString";EXPECT_EQ(to<folly::fbstring>(fbStrV), "FBString");folly::StringPiece spV("StringPiece");EXPECT_EQ(to<folly::StringPiece>(spV), "StringPiece");// RvaluesEXPECT_EQ(to<bool>(true), true);EXPECT_EQ(to<int>(42), 42);EXPECT_EQ(to<float>(4.2f), 4.2f);EXPECT_EQ(to<double>(.42), .42);
这个转换会进入到这个函数
template <class Tgt, class Src>
typename std::enable_if<std::is_same<Tgt, typename std::decay<Src>::type>::value,Tgt>::type
to(Src&& value) {return std::forward<Src>(value);
}
这段代码定义了一个名为 to
的模板函数,它使用了 C++11 中的模板元编程技术,特别是 std::enable_if
和 std::decay
,来实现类型安全的类型转换(或更准确地说,是类型转换的封装)。下面是对这段代码的详细解释:
- 模板参数:
Tgt
:目标类型,即你希望value
被转换成的类型。Src
:源类型,即传递给to
函数的值的当前类型。
std::enable_if
:- 这是一个条件编译工具,它根据给定的条件(在这里是
std::is_same<Tgt, typename std::decay<Src>::type>::value
)来决定是否定义一个类型或函数。 - 如果条件为真(即
Tgt
和std::decay<Src>::type
是相同的类型),std::enable_if
的第一个模板参数(这里是Tgt
)会被用作返回类型。 - 如果条件为假,则整个
std::enable_if
表达式的结果类型不会存在,这意味着函数模板to
将不会为那些不满足条件的类型组合实例化。
- 这是一个条件编译工具,它根据给定的条件(在这里是
std::decay
:std::decay
是一个类型转换工具,它将任何类型转换为它的“衰减值”。这通常意味着移除引用、cv 限定符(const 和 volatile),并将数组和函数类型转换为对应的指针类型。- 在这里,
std::decay<Src>::type
表示Src
类型经过std::decay
处理后的类型。
- 函数体:
- 如果
Tgt
和std::decay<Src>::type
相同,函数将返回通过std::fo
- 如果