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 常用于函数模板的重载文章来源地址https://www.toymoban.com/news/detail-563107.html

#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;
}

到了这里,关于std常用的模板元编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++ 11标准模板(STL) std::vector (二)

    template     class T,     class Allocator = std::allocatorT class vector; (1) namespace pmr {     template class T     using vector = std::vectorT, std::pmr::polymorphic_allocatorT; } (2) (C++17 起) 1) std::vector 是封装动态数组的顺序容器。 2) std::pmr::vector 是使用多态分配器的模板别名。 元素相继存储,这意味着不

    2024年02月02日
    浏览(55)
  • c++11 标准模板(STL)(std::unordered_multimap)(九)

    template     class Key,     class T,     class Hash = std::hashKey,     class KeyEqual = std::equal_toKey,     class Allocator = std::allocator std::pairconst Key, T class unordered_multimap; (1) (C++11 起) namespace pmr {     template class Key, class T,               class Hash = std::hashKey,               class Pred = std::equa

    2023年04月09日
    浏览(38)
  • c++11 标准模板(STL)(std::basic_istream)(三)

    template     class CharT,     class Traits = std::char_traitsCharT class basic_istream : virtual public std::basic_iosCharT, Traits  类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式的输入(例如整数值或空白符分隔的字符与字符串)和无格式输入(例如未处理字符和字符数组)

    2024年02月13日
    浏览(38)
  • c++11 标准模板(STL)(std::basic_ostream)(八)

    template     class CharT,     class Traits = std::char_traitsCharT class basic_ostream : virtual public std::basic_iosCharT, Traits 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式输出(例如整数值)和无格式输出(例如生字符和字符数组)。此功能以 basic_streambuf 类所提供的接

    2024年02月12日
    浏览(39)
  • c++11 标准模板(STL)(std::basic_ifstream)(一)

    定义于头文件  fstream template     class CharT,     class Traits = std::char_traitsCharT class basic_ifstream : public std::basic_istreamCharT, Traits 类模板 basic_ifstream 实现文件流上的高层输入操作。它将 std::basic_istream 的高层接口赋予基于文件的流缓冲( std::basic_filebuf )。 std::basic_ifstream 的典型实

    2024年02月14日
    浏览(34)
  • c++11 标准模板(STL)(std::basic_stringstream)(四)

    template     class CharT,     class Traits = std::char_traitsCharT class basic_stringstream; (C++11 前) template     class CharT,     class Traits = std::char_traitsCharT,     class Allocator = std::allocatorCharT class basic_stringstream; (C++11 起) 类模板 std::basic_stringstream 实现基于字符串的流上的输入与输出操作。它等效

    2024年02月10日
    浏览(35)
  • c++11 标准模板(STL)(std::basic_stringstream)(一)

    template     class CharT,     class Traits = std::char_traitsCharT class basic_stringstream; (C++11 前) template     class CharT,     class Traits = std::char_traitsCharT,     class Allocator = std::allocatorCharT class basic_stringstream; (C++11 起) 类模板 std::basic_stringstream 实现基于字符串的流上的输入与输出操作。它等效

    2024年02月10日
    浏览(38)
  • c++11 标准模板(STL)(std::basic_istream)(一)

    template     class CharT,     class Traits = std::char_traitsCharT class basic_istream : virtual public std::basic_iosCharT, Traits 类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式的输入(例如整数值或空白符分隔的字符与字符串)和无格式输入(例如未处理字符和字符数组)。

    2024年02月13日
    浏览(30)
  • c++11 标准模板(STL)(std::priority_queue)(四)

    template     class T,     class Container = std::vectorT,     class Compare = std::lesstypename Container::value_type class priority_queue; priority_queue 是容器适配器,它提供常数时间的(默认)最大元素查找,对数代价的插入与释出。 可用用户提供的 Compare 更改顺序,例如,用 std::greaterT 将导致最小元

    2024年02月01日
    浏览(43)
  • C++并发编程:std::future、std::async、std::packaged_task与std::promise的深度探索

    1.1 并发编程的概念 (Concept of Concurrent Programming) 并发编程是一种计算机编程技术,其核心在于使程序能够处理多个任务同时进行。在单核处理器上,虽然任何给定的时间只能运行一个任务,但通过任务切换,可以创建出并发执行的效果。而在多核处理器上,可以真正同时处理

    2024年02月05日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包