Mak*_*gan 5 c++ generics types casting
假设我们有一个包含两个类别的对象C1和C2的库A。
对于C1中的每个元素,C2中都有一个兼容的元素。
假设我们要创建一个将一个函数转换为另一个函数的通用函数。
template<typename C1, typename C2>
C2 SpecialCast(C1 c1) {
/* do some generic work */
}
Run Code Online (Sandbox Code Playgroud)
这就要求我们总是写。SpecialCast<Type>(parameter)但这是多余的,因为要知道转换类型就需要知道参数类型。因此,这给代码增加了不必要的冗长性。
理想的解决方案是定义一个vallid类型转换的头表,这样就可以做到:
template<typename C1>
C2 SpecialCast(C1 c1) {
/*get C2 from C1 using the table*/
/* do some generic work */
}
Run Code Online (Sandbox Code Playgroud)
但是我目前正在努力寻找一种以最简单的方式定义表的好方法。
使用助手类来定义相应的类型。比方说图书馆有班A1,A2和A3,即得到浇铸B1,B2和B3。那好吧:
template<typename T> struct type_map;
template<> struct type_map<A1> {
typedef B1 type_t;
};
template<> struct type_map<A2> {
typedef B2 type_t;
};
template<> struct type_map<A3> {
typedef B3 type_t;
};
Run Code Online (Sandbox Code Playgroud)
现在,SpecialCast可以简单地定义为
template<typename T>
typename type_map<T>::type_t SpecialCast(T t) {
/* do some generic work */
}
Run Code Online (Sandbox Code Playgroud)