C++ 关于萃取的三种方法

1,模板类萃取

#include <iostream>

struct NUMB {
	void add(int a, int b) {
		std::cout << a+b;
	}
};
struct CHAR {
	void add(char a, char b) {
		std::cout << a << b;
	}
};
//下面的萃取从int, double 得到NUMB大类,从char得到CHAR大类
template<typename T>
struct Triats{
};
template<>
struct Triats<int> {
	using impl = NUMB;
};
template<>
struct Triats<char> {
	using impl = CHAR;
};
template<>
struct Triats<double> {
	using impl = NUMB;
};

int main() {
	//根据大类创建对象后调用函数
	Triats<int>::impl().add(1,2);
}

2,is_same_v萃取(内部应该也是模板萃取)

#include <iostream>

int main() {
	auto add_lambda = [](auto i, auto j) 
    {
		using T = std::decay_t<decltype(i)>;
        //使用 if constexpr 为了增加编译代码量换取简便的运行
		if constexpr (std::is_same_v<T, int> || std::is_same_v<T, double>) {
			std::cout << i + j;
		} else if constexpr (std::is_same_v<T, char>) {
			std::cout << i << j;
		}
	};

	add_lambda(7,8);
	add_lambda(‘k’,‘l’);
}

3,variant方法

#include <iostream>
#include <variant>

using poly = std::variant<int ,double, char>;

void add_poly(poly a, poly b) {
//如果知道类型对应序号可以直接用index判断,否则用std::hold_alternative<>或者std::get_if<>
	switch (a.index()) {
		case 0:
			std::cout << std::get<0>(a) + std::get<0>(b);
			break;
		case 1:
			std::cout << std::get<1>(a) + std::get<1>(b);
			break;
		case 2:
			std::cout << std::get<2>(a) << std::get<2>(a);
			break;		
	}

}

int main() {
	poly a{9}, b{3};
	poly c{'j'}, d{'k'};
	
	add_poly(a, b);
	add_poly(c, d);
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值