std::true_type和std::false_type详解

std::true_type和std::false_type

认识

我们先通过一个例程来认识下它吧。

#include <iostream>
using namespace std;
int main()
{
    std::true_type a;
    std::false_type b;
    std::cout << a << std::endl;
    std::cout << b << std::endl;
	return 0;
}

在这里插入图片描述
分别输出了1和0.
接下来,再看看它的源码,其实挺简单的。

template <bool _Val>
using bool_constant = integral_constant<bool, _Val>;

using true_type  = bool_constant<true>;
using false_type = bool_constant<false>;

// STRUCT TEMPLATE integral_constant
template <class _Ty, _Ty _Val>
struct integral_constant {
    static constexpr _Ty value = _Val;

    using value_type = _Ty;
    using type       = integral_constant;
    constexpr operator value_type() const noexcept {
        return value;
    }
    _NODISCARD constexpr value_type operator()() const noexcept {
        return value;
    }
};

通过源码我们可以知道,其实它就是一个结构体模板。这里用到了using定义的模板,称为别名模板,这个知识点可以参考我这个系列的其它博客。

与true和false的区别

true_type,false_type:代表类型(类/结构体类型)
true,false:代表值
而bool既可以代表true也可以代表false。而true_type类型代表的就是true,false_type类型代表的就是false.

作用

我们知道要代表true和false用bool不就可以了吗?为什么还要整出这个玩意来,其实用处还是挺多的,一般是当作基类被继承,当作为基类被继承时,派生类也就具备了真或假的这种意味。比如标准库当中的is_pointer、is_union、is_function等类模板,都是继承自类似BoolConstant或者BoolConstant这样的基类来实现的。
下面我们先通过一个例程来认识下这个东西的用途吧。

#include <iostream>
using namespace std;
template <typename T, bool val>
struct AClass
{
    AClass() //构造函数
    {
        cout << "AClass::AClass()执行了" << endl;
        if (val)
        {
            T tmpa = 15;
        }
        else
        {
            T tmpa = "abc"; //这里有问题
        }
    }
};
int main()
{
    AClass<int, true> obj;
	return 0;
}

像上面这段代码大家可以知道,编译时就会报错的,
我们可以通过改成如下的方式去解决。

#include <iostream>
using namespace std;
template <typename T, bool val>
struct AClass
{
    AClass() //构造函数
    {
        cout << "AClass::AClass()执行了" << endl;
        if constexpr (val)
        {
            T tmpa = 15;
        }
        else
        {
            T tmpa = "abc";
        }
    }
};
int main()
{
    AClass<int, true> obj;
	return 0;
}

当然,最后我们还是要看看std::true_type 和std::false_type是怎么解决这个问题的。

#include <iostream>
using namespace std;
template <typename T, bool val>
struct AClass
{
    AClass() //构造函数
    {
        cout << "AClass::AClass()执行了" << endl;
        fun(bool_constant<val>());
    }
    void fun(std::true_type)
    {
        T tmpa = 15;
    }
    void fun(std::false_type)
    {
        T tmpa = "abc";
    }
};
int main()
{
    AClass<int, true> obj;
	return 0;
}

顺利通过编译。

  • 15
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
condition_variable是C++11中的一个线程库中的一种同步机制,用于在多线程环境中协调线程的执行顺序。它主要用于解决线程间的同步问题。 condition_variable的作用是在一个或多个线程等待特定条件的情况下,通知一个或多个线程开始或继续执行。当一个线程需要等待某个条件时,它会调用condition_variable::wait()函数,此时线程会被阻塞,等待某个条件变为真时被唤醒。当条件为真时,调用condition_variable::notify_one()或condition_variable::notify_all()函数即可通知等待的线程继续执行。 condition_variable的使用需要与std::unique_lock<std::mutex>搭配使用,这是因为在等待条件时需要使用互斥锁来保护共享数据,防止出现竞态条件。 condition_variable的基本用法如下: ```c++ #include <condition_variable> #include <mutex> #include <thread> std::condition_variable cv; // 条件变量 std::mutex mtx; // 互斥锁 bool ready = false; // 条件变量关联的共享变量 void thread_func() { std::unique_lock<std::mutex> lock(mtx); // 等待条件变为真 while (!ready) { cv.wait(lock); } // 条件变为真时执行 // ... } int main() { std::thread t(thread_func); // ... { std::lock_guard<std::mutex> lock(mtx); // 修改条件变量关联的共享变量 ready = true; } // 通知等待的线程 cv.notify_one(); t.join(); return 0; } ``` 在上述代码中,线程thread_func()会等待条件变量ready变为真时继续执行。在主线程中,当条件变为真时,通过调用cv.notify_one()函数通知等待的线程。注意,条件变量的等待必须在互斥锁的保护下进行,否则会导致竞态条件。因此,在等待条件变量时,需要使用std::unique_lock<std::mutex>来获得互斥锁的所有权。 总之,condition_variable是多线程编程中常用的同步机制,它可以协调线程的执行顺序,避免竞态条件的发生,从而保证程序的正确性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值