Modern C++ code snippets

这篇具有很好参考价值的文章主要介绍了Modern C++ code snippets。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 限制模板函数的模板参数类型

 2. CRTP (Curiously Recurring Template Pattern)

3. 元编程+insights

4. 完美转发

5. 工厂模式

6. Lamdba表达式

7. RAII - 自动释放资源

8. 其它小伎俩


1. 限制模板函数的模板参数类型

#include <iostream>
#include <type_traits>

// Expected class type
class MyClass {};

// Function template using std::enable_if to check if the type is MyClass
template<typename T>
typename std::enable_if<std::is_same<T, MyClass>::value, void>::type
checkType() {
    std::cout << "Type is MyClass" << std::endl;
}

int main() {
    checkType<int>(); // Won't compile, int is not MyClass
    checkType<MyClass>(); // Will compile and print "Type is MyClass"
    return 0;
}

 2. CRTP (Curiously Recurring Template Pattern)

template <typename Derived>
struct Base {
    void interface() {
        static_cast<Derived*>(this)->implementation();
    }
};

struct Derived : Base<Derived> {
    void implementation() {
        // Implementation details
    }
};

// Usage
Derived d;
d.interface(); // Calls Derived::implementation()

 CRTP + std::enable_shared_from_this<>

class Test: public std::enable_shared_from_this<Test>
{
    std::shared_ptr<Test> GetPtr(){
        return shared_from_this();
    }

    static std::shared_ptr<Test> Create(){
        return std::shared_ptr<Test>(new Test());
    }

   private://imply constructor, so you couldn't create a object pointed by Test*
    Test() = default;
};

3. 元编程+insights

template <int N>
struct Factorial {
    static const int value = N * Factorial<N - 1>::value;
};

template <>
struct Factorial<0> {
    static const int value = 1;
};

// Usage
int result = Factorial<5>::value; // result = 120

元编程不易理解,有个在线平台可以看到模板展开的样子

Modern C++ code snippets,modern C++,c++,开发语言,modern C++

4. 完美转发

#include <iostream>
#include <utility>

void process(int& value) {
    std::cout << "L-value reference: " << value << std::endl;
}

void process(int&& value) {
    std::cout << "R-value reference: " << value << std::endl;
}

template<typename T>
void forward(T&& value) {
    process(std::forward<T>(value));
}

// Usage
int a = 5;
forward(a); // Output: L-value reference: 5
forward(10); // Output: R-value reference: 10

5. 工厂模式

#include <iostream>

class Product {
public:
    virtual void printInfo() = 0;
};

class ConcreteProduct : public Product {
public:
    void printInfo() override {
        std::cout << "Concrete Product" << std::endl;
    }
};

class Factory {
public:
    virtual Product* createProduct() = 0;
};

class ConcreteFactory : public Factory {
public:
    Product* createProduct() override {
        return new ConcreteProduct();
    }
};

6. Lamdba表达式

#include <iostream>

void exampleLambda() {
    int increment = 5;
    auto addIncrement = [increment](int x) { return x + increment; };
    std::cout << addIncrement(10) << std::endl; // Output: 15
}

7. RAII - 自动释放资源

#include <iostream>
#include <fstream>
#include <string>
#include <stdexcept>

class FileResource {
public:
    explicit FileResource(const std::string& filename)
        : fileStream(filename) {
        if (!fileStream.is_open()) {
            throw std::runtime_error("Unable to open file");
        }
        std::cout << "File opened: " << filename << std::endl;
    }

    ~FileResource() {
        if (fileStream.is_open()) {
            fileStream.close();
            std::cout << "File closed" << std::endl;
        }
    }

    void writeToFile(const std::string& data) {
        fileStream << data << std::endl;
    }

private:
    std::ofstream fileStream;
};

int main() {
    try {
        FileResource file("example.txt");
        file.writeToFile("Hello, RAII!");
        // File automatically closed when 'file' goes out of scope
    } catch (const std::exception& e) {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
    return 0;
}

此思想经常用来加解锁。

8. 其它小伎俩

int mi = std::min({x1, x2, x3, x4});

#include <bits/stdc++.h>   //all headers in one

auto 

emplace_back is better than push_back

std::tuple<int, char, std::string> tp = std::make_tuple(1,'a',"bc");
std::cout<<std::get<0>(tp);
auto [i,c,s] = tp; //c++17

//deep copy
std::copy_n(arr1,n,arr2);

std::all_of
std::any_of
std::none_of

未完待续。。。文章来源地址https://www.toymoban.com/news/detail-783669.html

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

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

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

相关文章

  • 与AI合作 -- 写一个modern c++单例工厂

    目录 前言 提问 bard给出的答案 AI答案的问题 要求bard改进  人类智能 AI VS 人类 通过本文读者可以学到modern C++单例模式+工厂模式的混合体,同时也能看到:如今AI发展到了怎样的智能程度?怎样让AI帮助我们快速完成实现头脑中的想法?以及这样的智能程度会不会让程序员失

    2024年02月21日
    浏览(35)
  • USACO21FEB Modern Art 3 G

    P7414 [USACO21FEB] Modern Art 3 G 题目大意 给你一个长度为 n n n 的数组,要求你在一个全部为 0 0 0 的数组中每次将一个区间 [ i , j ] [i,j] [ i , j ] 赋为同一个值,当前的赋值可以覆盖之前的值,求最少要赋值多少次才能使这个数组与给定数组相同。 1 ≤ n ≤ 300 1leq nleq 300 1 ≤ n ≤

    2024年02月09日
    浏览(40)
  • Develop Modern WinForms Applications Using .NET 8

    Bunifu UI WinForms v7.0 streamlines professional WinForms UI development with the addition of Microsoft .NET 8 support. Bunifu UI WinForms is a user interface (UI) framework designed to streamline the development of modern and visually appealing desktop applications using Microsoft\\\'s WinForms platform. It provides a wide array of pre-built, customizable UI c

    2024年04月27日
    浏览(42)
  • Introduction to modern Cryptography 现代密码学原理与协议第二章笔记

    M表示明文空间,K表示密钥空间,C表示所有可能的密文集合 完善保密加密 的概念: 简化约定,不再特殊声明 ,除数为0无意义 完全保密加密的等价公式: 证明: 必要性证明略,此证明为条件概率的简单应用 完全不可区分性 : 完善保密加密的另一形式:  证明:   敌手不可区分性

    2024年02月03日
    浏览(40)
  • 【现代密码学】笔记6--伪随机对象的理论构造《introduction to modern cryphtography》

    主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充:骆婷老师的PPT 《introduction to modern cryphtography》–Jonathan Katz, Yehuda Lindell(现代密码学——原理与协议)中相关章节 密码学复习笔记 这个博主好有意思 初步笔记,如有错误请指正 快速补充一些密码

    2024年01月16日
    浏览(42)
  • 【现代密码学】笔记 补充7-- CCA安全与认证加密《introduction to modern cryphtography》

    主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充:骆婷老师的PPT 《introduction to modern cryphtography》–Jonathan Katz, Yehuda Lindell(现代密码学——原理与协议)中相关章节 密码学复习笔记 这个博主好有意思 初步笔记,如有错误请指正 快速补充一些密码

    2024年01月17日
    浏览(51)
  • 【现代密码学】笔记3.1-3.3 --规约证明、伪随机性《introduction to modern cryphtography》

    主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充:骆婷老师的PPT 《introduction to modern cryphtography》–Jonathan Katz, Yehuda Lindell(现代密码学——原理与协议)中相关章节 密码学复习笔记 这个博主好有意思 B站视频 密码学原理《Introduction to modern Cryptog

    2024年01月20日
    浏览(50)
  • 【现代密码学】笔记4--消息认证码与抗碰撞哈希函数《introduction to modern cryphtography》

    主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充:骆婷老师的PPT 《introduction to modern cryphtography》–Jonathan Katz, Yehuda Lindell(现代密码学——原理与协议)中相关章节 密码学复习笔记 这个博主好有意思 初步笔记,如有错误请指正 快速补充一些密码

    2024年01月18日
    浏览(49)
  • 【现代密码学】笔记3.4-3.7--构造安全加密方案、CPA安全、CCA安全 《introduction to modern cryphtography》

    主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充:骆婷老师的PPT 《introduction to modern cryphtography》–Jonathan Katz, Yehuda Lindell(现代密码学——原理与协议)中相关章节 密码学复习笔记 这个博主好有意思 初步笔记,如有错误请指正 快速补充一些密码

    2024年01月24日
    浏览(47)
  • 论文精读:《BEVFormer v2: Adapting Modern Image Backbones to Bird’s-Eye-View Recognition via Perspective 》

    本文工作: 提出了一种具有透视监督(perspective supervision)的新型鸟瞰(BEV)检测器,该检测器收敛速度更快,更适合现代图像骨干。 现有的最先进的BEV检测器通常与VovNet等特定深度预训练的主干相连,阻碍了蓬勃发展的图像主干和BEV检测器之间的协同作用。 为了解决这一限制

    2024年02月04日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包