元编程
- 定义
- 元编程是一种编程范式,它允许程序员便携通用代码,以便在不同数据类型上操作
- 元编程中,程序本身是动态的,程序运行也是动态的。元编程将程序作为数据来对待,从而赋予变成语言更加强大的表达能力
使用模板元编程实现类型选择和编译时计算
#include<iostream>
#include<type_traits>
#include<typeinfo>
template <bool B, typename T, typename F>
using conditional_t = typename std::conditional<B,T,F>::type;
template <int N>
struct factorial
{
static constexpr int value = N * factorial<N - 1>::value;
};
template <>
struct factorial<0>
{
static constexpr int value = 1;
};
template <typename T>
struct is_pointer : std::false_type{};
template <typename T>
struct is_pointer<T*> : std::true_type {};
int main()
{
constexpr int fact_5 = factorial<5>::value;
std::cout << "Factorial of 5 is " << fact_5 << std::endl;
using type = conditional_t<is_pointer<int>::value, int*, double>;
std::cout << "Type is " << typeid(type).name() << std::endl;
return 0;
}
使用模板元编程实现递归和循环
#include<iostream>
#include<type_traits>
template <int N>
struct factorial
{
static constexpr int value = N * factorial<N-1>::value;
};
template <>
struct factorial<0>
{
static constexpr int value = 1;
};
template <int N>
struct fibonacci
{
static constexpr int value = fibonacci<N-1>::value + fibonacci<N-2>::value;
};
template <>
struct fibonacci<0>
{
static constexpr int value = 0;
};
template <>
struct fibonacci<1>
{
static constexpr int value = 1;
};
int main()
{
constexpr int fact_5 = factorial<5>::value;
std::cout << "Factorial of 5 is " << fact_5 << std::endl;
constexpr int fib_10 = fibonacci<10>::value;
std::cout << "Fibonacci number at point 10 is " << fib_10 << std::endl;
return 0;
}
使用模板元编程实现函数式编程
#include <iostream>
#include <functional>
template <typename F, typename... Args>
auto curry(F f, Args... args) {
return = {
return f(args..., new_args...);
};
}
int add(int a, int b, int c) {
return a + b + c;
}
int main() {
auto add5 = curry(add, 5);
auto add5and6 = curry(add5, 6);
std::cout << add5and6(7) << std::endl;
return 0;
}
- 编译时一直要求 auto 指定返回类型。未通过编译
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
2019-10-09 多级指针使用分割字符串
2019-10-09 BMP图像信息隐藏