monster

monster

现代C++模板元编程框架助力编译时算法开发

Monster是一款基于C++20的模板元编程框架,专为编译时算法和序列操作设计。它提供了一套完整的工具,支持纯类型编程,并充分利用了概念和Lambda模板等现代C++特性。作为一个仅包含头文件的库,Monster无需额外依赖,适用于各种需要高效编译时计算的项目。该框架通过简化高级模板元编程的复杂性,使开发者能更轻松地实现和维护相关代码。

MonsterC++模板元编程编译时算法序列操作高阶元函数Github开源项目

Monster 许可证 文档 语言 平台 Gitter聊天

高级C++模板元编程框架

概述

#include <cstdint> #include <monster.hpp> using namespace monster; int main(int argc, char* argv[]) { // 将相同元素在序列中排列相邻,保持相对顺序 using a1 = adjacent_t<std::tuple<char, double, char, int, double>>; using a2 = adjacent_t<std::index_sequence<4, 3, 0, 3, 2, 4, 5, 3>>; static_assert(std::is_same_v<a1, std::tuple<char, char, double, double, int>>); static_assert(std::is_same_v<a2, std::index_sequence<4, 4, 3, 3, 3, 0, 2, 5>>); // Boyer-Moore-Horspool (BMH)算法在一个序列中搜索另一个序列的出现 using b1 = bmh_t<std::tuple<int, char, int>, std::tuple<int, int, char, int, char, int, char, int>>; using b2 = bmh_t<std::integer_sequence<int, 7, 5>, std::integer_sequence<int, 7, 5, 4, 0, 7, 5, 9>>; static_assert(std::is_same_v<b1, std::index_sequence<1, 3, 5>>); static_assert(std::is_same_v<b2, std::index_sequence<0, 4>>); // Knuth–Morris–Pratt (KMP)算法在一个序列中搜索另一个序列的出现 using k1 = kmp_t<std::tuple<int, char, int>, std::tuple<int, int, char, int, char, int, char, int>>; using k2 = kmp_t<std::integer_sequence<int, 7, 5>, std::integer_sequence<int, 7, 5, 4, 0, 7, 5, 9>>; static_assert(std::is_same_v<k1, std::index_sequence<1, 3, 5>>); static_assert(std::is_same_v<k2, std::index_sequence<0, 4>>); // 在序列中找到第K小的元素(k == 2) using min1 = select_t<2, std::tuple<short, int, double, int, char>>; using min2 = select_t<2, std::integer_sequence<int, -2, 1, 0, -7, 4, 3>>; static_assert(std::is_same_v<min1, short>); static_assert(std::is_same_v<min2, c_<-2>>); // 在序列中找到第K大的元素(k == 2) using max1 = select_t<2, std::tuple<short, int, double, int, char>, greater_equal_t>; constexpr auto max2 = select_v<2, std::integer_sequence<int, -2, 1, 0, -7, 4, 3>, greater_equal_t>; static_assert(std::is_same_v<max1, int>); static_assert(max2 == 3); // 返回序列中特定索引的元素 using e1 = element_t<1, std::tuple<char, double, int>>; using e2 = element_t<3, std::integer_sequence<int, 1, -2, 7, 4>>; constexpr auto e3 = element_v<3, std::integer_sequence<int, 1, -2, 7, 4>>; static_assert(std::is_same_v<e1, double>); static_assert(std::is_same_v<e2, c_4>); static_assert(e3 == 4); // 从序列中移除重复元素,保留第一次出现 using u1 = unique_t<std::tuple<int, char, int, double>>; using u2 = unique_t<std::integer_sequence<int, 2, 2, 3, 4, 3>>; static_assert(std::is_same_v<u1, std::tuple<int, char, double>>); static_assert(std::is_same_v<u2, std::integer_sequence<int, 2, 3, 4>>); // 交换序列中特定索引的元素 using s1 = swap_t<1, 3, std::tuple<int, double, char, float>>; using s2 = swap_t<0, 2, std::integer_sequence<int, 1, -2, 7, 4>>; static_assert(std::is_same_v<s1, std::tuple<int, float, char, double>>); static_assert(std::is_same_v<s2, std::integer_sequence<int, 7, -2, 1, 4>>); // 按值对序列中的元素进行排序 using s3 = quick_sort_t<std::tuple<double, short, double, int, char, char, double>>; using s4 = quick_sort_t<std::integer_sequence<int, 2, 1, 0, -3, 4, 1, -7, 5, -2>>; static_assert(std::is_same_v<s3, std::tuple<char, char, short, int, double, double, double>>); static_assert(std::is_same_v<s4, std::integer_sequence<int, -7, -3, -2, 0, 1, 1, 2, 4, 5>>); // 按索引对序列中的元素进行排序 using s5 = sort_index_t<std::tuple<double, short, double, int, char, char, double>>; using s6 = sort_index_t<std::integer_sequence<int, 2, 1, 0, -3, 4, 1, -7, 5, -2>>; static_assert(std::is_same_v<s5, std::index_sequence<4, 5, 1, 3, 6, 2, 0>>); static_assert(std::is_same_v<s6, std::index_sequence<6, 3, 8, 2, 1, 5, 0, 4, 7>>); // 反转序列中元素的顺序 using r1 = reverse_t<std::tuple<float, double, int, short>>; using r2 = reverse_t<std::integer_sequence<int, 1, 0, 2, -2, 7, 6>>; static_assert(std::is_same_v<r1, std::tuple<short, int, double, float>>); static_assert(std::is_same_v<r2, std::integer_sequence<int, 6, 7, -2, 2, 0, 1>>); // 递归地反转序列元素的顺序 using r3 = reverse_recursive_t<std::tuple<int, std::tuple<int, std::tuple<char, short>>, char>>; using r4 = reverse_recursive_t<std::tuple<char, std::integer_sequence<int, 7, 2, 0, 4, 8>, int>>; static_assert(std::is_same_v<r3, std::tuple<char, std::tuple<std::tuple<short, char>, int>, int>>); static_assert(std::is_same_v<r4, std::tuple<int, std::integer_sequence<int, 8, 4, 0, 2, 7>, char>>); // 旋转序列中[begin, middle, end)范围内的元素 using r5 = rotate_t<0, 2, 5, std::tuple<int, char, double, float, int64_t>>; using r6 = rotate_t<2, 4, 7, std::integer_sequence<int, 9, 8, 1, 2, 3, 4, 5, 7, 6>>; static_assert(std::is_same_v<r5, std::tuple<double, float, int64_t, int, char>>); static_assert(std::is_same_v<r6, std::integer_sequence<int, 9, 8, 3, 4, 5, 1, 2, 7, 6>>); // 返回序列中[begin, end)范围内的元素 using r7 = range_t<1, 5, std::tuple<int, char, float, double, int, short>>; using r8 = range_t<2, 6, std::integer_sequence<int, 1, 2, -2, 4, 3, 5, 8, -5>>; static_assert(std::is_same_v<r7, std::tuple<char, float, double, int>>); static_assert(std::is_same_v<r8, std::integer_sequence<int, -2, 4, 3, 5>>); return 0; } ## 简介 Monster是一个元编程库,它是仅头文件的、可扩展的,并且面向现代C++它以纯类型编程的形式展示了编译时算法、序列和高阶元函数。 Monster提供了概念基础和一套广泛的强大而连贯的工具,使得在现代C++中进行显式的高级模板元编程(TMP)变得简单而愉快。 ## 编译器要求 该库依赖于C++20编译器和标准库,但不需要其他任何东西。 更具体地说,Monster需要支持以下C++20特性(非详尽列举)的编译器/标准库: - 概念 - Lambda模板 - <type_traits>头文件中的所有C++20类型特征 ## 构建 Monster是仅头文件的。要使用它,只需在源文件中添加必要的`#include`行,如下所示: ```cpp #include <monster.hpp>

要使用cmake构建示例,请cd到项目根目录并设置构建目录:

mkdir build cd build cmake ..

编译并安装可执行文件:

make -j4
make install

可执行文件现在位于项目根目录的bin目录中。 示例也可以使用build.sh脚本构建,只需运行它,可执行文件将被放置在/tmp目录中。

文档

你可以在Guidelines.md在线浏览文档。 文档涵盖了你所需要的一切,包括安装库、目录和带有示例的广泛参考部分。

完整示例

请参阅Tutorial.md

许可证

Monster的许可证为Boost软件许可证1.0版

编辑推荐精选

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具使用教程AI营销产品酷表ChatExcelAI智能客服
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

热门AI工具生产力协作转型TraeAI IDE
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

数据安全AI助手热门AI工具AI辅助写作AI论文工具论文写作智能生成大纲
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

热门AI工具AI办公办公工具智能排版AI生成PPT博思AIPPT海量精品模板AI创作
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

下拉加载更多