模板矢量到矢量的转换函数
template vector to vector convert function
我有一个基类,它有4个不同的参数向量:HW、SW、FW、高级
每个类都派生自基类,并且需要能够从一个参数向量转换为另一个。
例如:转换(Vector vec1,Vector vec2);
一种实现方式是使用16种静态转换情况。然而,虽然目前有4种不同类型的矢量,但稍后可能会添加更多矢量。
并不是所有的类都实现了所有的16个转换。它们中的许多将使用默认转换(我想在基类中实现它,返回"无转换定义错误");
class A: public baseClass
Class B: public baseClass
Class C: public baseClass
C::Convert(Vector<HW> vec1, Vector<SW> vec2)
{
vec2[0] = vec1[0] +vec1[1] *1.5;
}
B::Convert(Vector<HW> vec1, Vector<SW> vec2)
{
vec2[0] = vec1[0] +vec1[1] *3.7;
}
A::Convert(Vector<SW> vec1, Vector<HW> vec2)
{
vec2[0] = vec1[2] +vec1[1] *9;
}
定义泛型转换的好方法是什么?我想也许是矢量的模板。
Template<Vector<K>, Vector<T>>
void Convert(const k& vec1, T vec2)
我不能假设存在从每个向量到另一个向量的转换。
您可以使用模板方法,参见示例:
#include <iostream>
#include <vector>
class Hw {};
class Sw {};
// base class with default converters
class Base {
public:
template <class From, class To>
void convert(const From& from, To& to);
};
// specialize template with default converters
template <>
void Base::convert(const std::vector<Hw>& from, std::vector<Sw>& to) {
std::cout << "default converter" << std::endl;
}
// specialize forbidden version with runtime error
// (simply don't specialize anything to get link error, which is better)
template <>
void Base::convert(const std::vector<Hw>& from, std::vector<Hw>& to) {
std::cout << "error converter" << std::endl;
}
// override some default behaviour
class A : public Base {
public:
// show you want to use other default converters
using Base::convert;
// special (not default) behaviour
void convert(const std::vector<Hw>& from, std::vector<Sw>& to) {
std::cout << "special A converter" << std::endl;
}
};
// converter with defaults
class B : public Base {
};
int main() {
std::vector<Hw> hw_vector;
std::vector<Sw> sw_vector;
A a;
a.convert(hw_vector, sw_vector); // special A converter
a.convert(hw_vector, hw_vector); // error converter
B b;
b.convert(hw_vector, sw_vector); // default converter
b.convert(hw_vector, hw_vector); // error converter
return 0;
}
确定一个向量,该向量将成为所有向量的基,例如,base,每个向量都可以自动转换为base。然后所要做的就是提供从基地到所有其他基地的转换。
因此,对于您添加的每个向量,您需要提供2个函数:自动从它更改为基地,并从基地更改为它。
因此,为了从Vec1转换为Vec2,您只需要一个函数(它只是模板的草图):
Vec2 Convert<Vec1, Vec2>(Vec1 v1, Vec2 v2) {
return v1.toBase().toVec2();
}
相关文章:
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C++:用户定义的显式类型转换函数错误
- 为什么下面带有非常量转换函数的代码没有歧义?
- 为什么转换函数声明不需要至少一个定义类型说明符
- PCL:当我在setConditionFunction中使用std::bind 时,没有合适的转换函数
- C++ 通过自定义赋值运算符隐式转换函数参数
- 当我使用 void 函数的返回值(通过强制转换函数指针)时,究竟会发生什么?
- 在C++中自动向下转换函数参数
- static_cast:转换函数模板——它们真的有效吗
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类
- 隐式转换函数的返回对象时是否会影响性能?
- C++不存在合适的转换函数
- 为什么允许 int 和 const int 使用不同的转换函数?
- 使用转换函数直接初始化
- 为什么用户定义的转换函数模板不能有推导的返回类型?
- 为什么我会收到转换函数错误
- 选择用于赋值初始化的转换函数的优先级
- 我收到错误:没有合适的转换函数从 std::basic_istream<char、std::char_traits<char>> 到 char 存在
- 具有转换函数的 lambda,指向具有 C++ 链接的函数的指针
- 使用模板和部分专用化生成类型转换函数