如果编译期满足B,那么返回类型T,否则编译报错
如果编译期满足B,那么返回类型T,否则返回类型F
下面是一个示例,展示如何使用 `std::conditional` 来选择返回类型:
#include
#include
template
auto max(T a, U b) -> typename std::conditional<(sizeof(T) > sizeof(U)), T, U>::type {
return (a > b) ? a : b;
}
int main() {
int a = 5;
double b = 3.14;
auto result = max(a, b);
std::cout << "Max value: " << result << std::endl;
return 0;
}
在上面的示例中,`max` 函数使用了 `std::conditional` 来根据两个参数的类型选择返回类型。如果 `sizeof(T) > sizeof(U)`,则返回类型为 `T`,否则返回类型为 `U`。在 `main` 函数中,我们调用 `max` 函数并打印返回值,演示了根据条件选择返回类型的功能。
需要注意的是,`std::conditional` 是一个模板类,它提供了在编译时进行类型选择的能力。它在很多情况下可以用来实现类型萃取(type traits)和条件编译等功能。
`std::integral_constant
`std::integral_constant
下面是一个示例,展示如何使用 `std::integral_constant` 来表示编译时的布尔常量:```cpp
#include
#include
int main() {
std::integral_constant true_value;
std::integral_constant false_value;
std::cout << "true_value: " << true_value << std::endl;
std::cout << "false_value: " << false_value << std::endl;
std::cout << "true_value type: " << typeid(true_value).name() << std::endl;
std::cout << "false_value type: " << typeid(false_value).name() << std::endl;
std::cout << "true_value value: " << true_value() << std::endl;
std::cout << "false_value value: " << false_value() << std::endl;
return 0;
}
在上面的示例中,我们创建了 `true_value` 和 `false_value` 两个 `std::integral_constant` 实例,分别表示编译时的 `true` 和 `false` 布尔常量。我们使用 `std::cout` 打印了各个常量的值、类型和调用结果。
需要注意的是,`std::integral_constant
此外,C++ 标准库中的 `std::integral_constant` 还提供了一系列的成员类型和成员函数,如 `value_type`、`operator()`、`operator bool` 等,用于操作和查询包装的常量。这些成员函数和成员类型可以用于进行类型推导、模板元编程和编译时条件判断等用途。
下面看一个比较难的应用,将类型和自定义的数字联系起来,做一些类型判断:
#include
enum class type {
none_type,
// Integer types should go first,
int_type,
uint_type,
long_long_type,
ulong_long_type,
int128_type,
uint128_type,
bool_type,
char_type,
last_integer_type = char_type,
// followed by floating-point types.
float_type,
double_type,
long_double_type,
last_numeric_type = long_double_type,
cstring_type,
string_type,
pointer_type,
custom_type
};
// Maps core type T to the corresponding type enum constant.
template
struct type_constant : std::integral_constant {};
#define FMT_TYPE_CONSTANT(Type, constant) \
template <> \
struct type_constant \
: std::integral_constant {}
FMT_TYPE_CONSTANT(int, int_type);
FMT_TYPE_CONSTANT(unsigned, uint_type);
FMT_TYPE_CONSTANT(long long, long_long_type);
FMT_TYPE_CONSTANT(unsigned long long, ulong_long_type);
FMT_TYPE_CONSTANT(bool, bool_type);
FMT_TYPE_CONSTANT(float, float_type);
FMT_TYPE_CONSTANT(double, double_type);
FMT_TYPE_CONSTANT(long double, long_double_type);
FMT_TYPE_CONSTANT(const void*, pointer_type);
constexpr bool is_integral_type(type t) {
return t > type::none_type && t <= type::last_integer_type;
}
constexpr bool is_arithmetic_type(type t) {
return t > type::none_type && t <= type::last_numeric_type;
}
int main()
{
int a = 12;
std::cout<< is_integral_type(type_constant::value)<::value)<
`std::underlying_type
`std::underlying_type` 是一个模板类,接受一个类型参数 `T`,它用于表示一个枚举类型。`std::underlying_type
下面是一个示例,展示如何使用 `std::underlying_type
#include
#include
enum class MyEnum : unsigned int {
Value1,
Value2,
Value3
};
int main() {
using UnderlyingType = std::underlying_type::type;
std::cout << "Underlying type of MyEnum: " << typeid(UnderlyingType).name() << std::endl;
return 0;
}
在上面的示例中,我们定义了一个枚举类型 `MyEnum`,包含三个枚举值。然后,我们使用 `std::underlying_type
在这个示例中,我们使用 `std::underlying_type` 来获取 `MyEnum` 的底层类型。`UnderlyingType` 类型别名被推导为 `unsigned int`,这是 `MyEnum` 底层的类型。
`std::underlying_type` 对于在编译时获取枚举类型的底层类型非常有用。它可以用于处理枚举类型的底层值,进行位操作或其他需要底层类型的操作。
移除类型T的各种限定符。
比如:const、volatile、左值引用T&。
std::is_same
是 C++ 标准库中的一个类型特性工具,用于检查类型 T
和类型 T2
是否相同。值得注意的是,cv限定符会让类型不同。
#include
#include
int main() {
bool isSame = std::is_same::value;
std::cout << "isSame: " << isSame << std::endl; // true
isSame = std::is_same::value;
std::cout << "isSame: " << isSame << std::endl; // false
bool isSame = std::is_same::value;
std::cout << "isSame: " << isSame << std::endl; // false
isSame = std::is_same::value;
std::cout << "isSame: " << isSame << std::endl; // false
isSame = std::is_same::value;
std::cout << "isSame: " << isSame << std::endl; // false
return 0;
}
`std::is_base_of
`std::is_base_of` 是一个类型特性(type trait),它提供了一种在编译时判断一个类型是否是另一个类型的基类或派生类的机制。它属于 C++ 类型特性库(type traits library)的一部分,位于 `
在给定的代码中,`std::is_base_of
具体的使用示例如下:
// A base class for compile-time strings.
struct compile_string {};
template
struct is_compile_string : std::is_base_of {};
template ::value>::value>
constexpr auto to_string_view(const S& s)
-> basic_string_view {
return basic_string_view(s);
}
在上面的示例中,我们使用 `std::is_base_of` 来检查 `derived_class` 是否是 `compile_string` 的派生类。根据返回的结果,我们输出相应的信息。
需要注意的是,`std::is_base_of` 是在编译时进行类型检查的,它只能用于判断类型之间的继承关系,而不能用于检查对象之间的关系。
std::declval
是 C++ 标准库中的一个模板函数 std::declval
的使用,用于获取类型 S
的一个虚拟值(引用)。
std::declval
是一个函数模板,它允许在不实际创建对象的情况下,获取一个类型的虚拟值。它位于
头文件中。
在给定的代码中,std::declval
用于获取类型 S
的一个虚拟值。它返回一个该类型的右值引用(Rvalue reference)。
std::declval
的主要用途是用于在编译时创建对类型的引用,以便在模板编程中进行类型推断。它通常与 decltype
一起使用,用于声明返回类型或推断表达式的类型。需要注意的是,std::declval
用于创建虚拟值,但不能用于实际访问该值。它主要用于模板元编程中,用于推断类型和进行 SFINAE(Substitution Failure Is Not An Error)。
template
struct is_string
: std::is_class()))> {};
template struct char_t_impl {};
template struct char_t_impl::value>> {
using result = decltype(to_string_view(std::declval()));
using type = typename result::value_type;
};
// detail::to_string_view see below
template ::value)>::value>
inline auto to_string_view(const Char* s) -> basic_string_view {
return s;
}
template
inline auto to_string_view(const std::basic_string& s)
-> basic_string_view {
return s;
}
template
constexpr auto to_string_view(basic_string_view s)
-> basic_string_view {
return s;
}
template >::value>::value>
inline auto to_string_view(std_string_view s) -> basic_string_view {
return s;
}
template ::value>::value>
constexpr auto to_string_view(const S& s)
-> basic_string_view {
return basic_string_view(s);
}
void to_string_view(...);
比如上面,创建了一个虚拟的S对象的引用,用于驱动`detail::to_string_view`模板进行类型推断,从而判断是否可以继续编译。