std常用的模板元编程

std常用的模板元编程

std::conditional_t

std::conditional_t 是 C++ 标准库中的一个模板类,用于实现条件编译。它使用一个布尔类型的常量表达式作为条件,如果条件为 true,则该模板类指定为第二个参数;否则指定为第三个参数。这个模板类可以方便地在编译期间进行类型选择,并返回相应的类型。

#include <iostream>
#include <type_traits>

template <typename T, bool UseFloat>
struct MyType
{
    using type = std::conditional_t<UseFloat, float, T>;
};

int main()
{
    MyType<int, false>::type a = 42;
    MyType<long, true>::type b = 3.14f;
    std::cout << "a = " << a << ", b = " << b << std::endl;
    return 0;
}

在这个示例中,我们定义了一个模板类 MyType,它有两个模板参数:T 表示原始类型,UseFloat 表示是否需要使用浮点类型。在这个模板类中,我们使用了 std::conditional_t 宏,如果 UseFloat 为 true,则选择 float 类型,否则选择原始类型 T。最终,我们分别使用 MyType<int, false>::type 和 MyType<long, true>::type 定义 a 和 b 两个变量,并输出它们的值。

根据上述代码,a 的类型为 int,其值为 42;b 的类型为 float,其值为 3.14。这个示例演示了 std::conditional_t 的用法和作用,可以方便地实现编译期间的类型选择。

std::is_same

std::is_same 是 C++ 标准库中的一个类型特性类模板,可以用于判断两个类型是否相同。如果两个类型相同,则 std::is_same 的 value 成员常量为 true;否则为 false

#include <iostream>
#include <type_traits>

int main()
{
    bool is_same1 = std::is_same<int, long>::value; // false
    bool is_same2 = std::is_same<int, int>::value; // true
    bool is_same3 = std::is_same<std::string, const char*>::value; // false
    bool is_same4 = std::is_same<std::string, std::string>::value; // true

    std::cout << std::boolalpha; // 输出 true/false,而不是 1/0
    std::cout << "is_same1: " << is_same1 << std::endl;
    std::cout << "is_same2: " << is_same2 << std::endl;
    std::cout << "is_same3: " << is_same3 << std::endl;
    std::cout << "is_same4: " << is_same4 << std::endl;

    return 0;
}

在这个示例中,我们使用 std::is_same 分别对四组类型进行判断。第一组是 int 和 long,显然两个类型不同,所以 is_same1 的值为 false;第二组是 int 和 int,两个类型相同,所以 is_same2 的值为 true;第三组是 std::string 和 const char*,它们虽然有一些相似之处,但它们并不是同一种类型,所以 is_same3 的值为 false;最后一组是 std::string 和 std::string,它们的类型完全相同,所以 is_same4 的值为 true。

同时,还有一个 std::is_same_v 的辅助函数版本,可以更加方便地使用

bool is_same1 = std::is_same_v<int, long>; // false
std::enable_if

std::enable_if 是 C++ 标准库中的一个模板元编程工具,用于根据特定条件来选择函数模板的实现。它被设计用于在编译期间判断一个布尔表达式是否为 true,如果为 true,则启用指定的函数模板实现;否则,禁用该实现。

std::enable_if 常用于函数模板的重载

#include <iostream>
#include <type_traits>

template <typename T,
          typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
void print_integral(T value)
{
    std::cout << "This is an integral: " << value << std::endl;
}

template <typename T,
          typename std::enable_if<!std::is_integral<T>::value, int>::type = 0>
void print_integral(T value)
{
    std::cout << "This is not an integral: " << value << std::endl;
}

int main()
{
    print_integral(42);         // This is an integral: 42
    print_integral(3.14);       // This is not an integral: 3.14
    print_integral("Hello");    // This is not an integral: Hello

    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值