C++现代教程四

12 篇文章 0 订阅
10 篇文章 0 订阅
float转string不带多余0
float a = 1.2;
std::tostring(a); 		 // 1.200000
std::ostringstream strStream;
strStream << a; // 1.2
if (!strStream.view().empty())	// 判定流有数据

// 边框融合
float measureText(std::u8string text, FontTypes::Rectangle &rectangle)
{
    float width   = 0;
    auto  results = shape(text, {});
    if (results.empty())
        return 0;
    using FLimit = std::numeric_limits<float>;
    float minX   = FLimit::max();
    float minY   = FLimit::max();
    float maxX   = FLimit::min();
    float maxY   = FLimit::min();
    for (auto &result : results) {
        FontTypes::Rectangle inkBound, outBound;
        getGlyphBound(result.codepoint, inkBound, outBound);
        inkBound.x += width;

        minX = std::min(minX, inkBound.x);
        minY = std::min(minY, inkBound.y);
        maxX = std::max(maxX, inkBound.x + inkBound.width);
        maxY = std::max(maxY, inkBound.y + inkBound.height);

        width += result.advance;
    }
    rectangle.x      = minX;
    rectangle.y      = minY;
    rectangle.width  = maxX - minX;
    rectangle.height = maxY - minY;
}

// #line使用
#line 143 "emoji_presentation_scanner.c" 这行代码告诉预处理器,从这行开始,任何编译错误或警告都应该指向 "emoji_presentation_scanner.c" 文件的第 143 行。
如果你使用脚本或工具自动生成代码,#line 指令可以用来设置生成代码的行号和文件名,确保错误信息指向生成代码的源文件和行号。
#line 100 "generated_code.c"		// Auto-generated code goes here.. 
#line 指令可以在宏体内重设行号和文件名,以便错误信息指向宏定义处,而不是宏展开处
#define MY_MACRO() \
 do { \
   #line __LINE__ + 1 __FILE__ \
   /* ... macro body ... */ \
 } while(0)
 
# 范围限制
#define LimitRange(x, min, max)  x = x < min ? min : (x > max ? max : x)

# std::call_once
保证函数或者一些代码段在并发或者多线程的情况下,始终只会被执行一次。
#include <iostream>
#include <mutex>
#include <thread>
std::once_flag flag;

void initializeResource() {
    std::cout << "Resource initialized." << std::endl;
    // 进行初始化工作
}

void doSomething() {
    std::call_once(flag, initializeResource);
    // 在这里可以安全地使用已初始化的资源
    std::cout << "Doing something with the resource." << std::endl;
}

int main() {
    std::thread t1(doSomething);
    std::thread t2(doSomething);

    t1.join();
    t2.join();

    return 0;
}

// bitset初始化
template <typename... T>
constexpr auto BitSet(T... t)
{
    return ((1 << (t)) | ...);
}

// 超长枚举
enum Flag : uint16_t{
	A = 1,
	B,
	C,
	AB = BitSet(A, B);
	ABC = BitSet(A, B, C);
};


/*
 * C++ IMPL通用模板设计
 */

/*
 * 数据层
 */
class Data {
public:
	float a;
	float b;
	float c;
};

/*
 * 接口层
 */
class Accessor {
public:
    using Impl = Data;
    using ImplSP = std::shared_ptr<Data>;
	
	Accessor() : m_impl(std::make_shared<Impl>) {}
	
	void setA(float v) { m_impl->a = v; }
	float getA() const { return m_impl->a; }
private:
	ImplSP m_impl;
};

C++ 现代教程三-CSDN博客


创作不易,小小的支持一下吧!

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码力码力我爱你

创作不易,小小的支持一下吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值