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);
}