amb*_*hai 3 c++ programming-languages duck-typing structural-typing
在C++中如何告诉编译器Ogre :: Vector3 IS_SAME_AS SomeOtherLIB :: Vector3?我觉得......在像c ++这样的语言中,它们不是结构类型的,但有些情况下它是有意义的.
通常作为游戏开发人员使用4个以上提供排序或自己的Vector3实现的库.代码中充斥着ToOgre,ToThis,ToThat转换功能.这是很多Float3复制周围不应该发生在第一位.
是C++或任何其他语言,我们没有必要从一种类型转换(复制)到另一种类型,这基本上是相同的.但是C++中的任何解决方案都是大多数优秀的gamedevs库,都是针对c/c ++的.
sep*_*p2k 17
如果使用模板,只要在该类型上定义了必要的操作,就可以定义采用任何类型参数的函数.例:
class Foo { void quack() {} };
class Bar { void quack() {} };
class Baz {};
template<typename Duck>
void f(Duck d) {
d.quack();
}
int main() {
f(Foo()); // works
f(Bar()); // works
f(Baz()); // compile error because Baz does not have a quack method
return 0;
}
Run Code Online (Sandbox Code Playgroud)
虽然它不适合任何情况,但模板可以为您提供"编译时鸭子打字".
假设你有两种矢量类型:
struct Vec3A {
float x, y, z;
};
struct Vec3B {
float p[3];
};
Run Code Online (Sandbox Code Playgroud)
您可以定义隐藏实现如何获取组件的函数模板:
template<class T> float get_x(const T&);
template<class T> float get_y(const T&);
template<class T> float get_z(const T&);
template<> float get_x<Vec3A>(const Vec3A& v) { return v.x; }
// ...
template<> float get_x<Vec3B>(const Vec3B& v) { return v.p[0]; }
// ...
Run Code Online (Sandbox Code Playgroud)
有了这样的帮助器,您现在可以编写适用于以下两者的通用函数:
template<class T> float length(const T& t) {
return std::sqrt(std::pow(get_x(t), 2),
std::pow(get_y(t), 2),
std::pow(get_z(t), 2));
}
Run Code Online (Sandbox Code Playgroud)
您还可以继续专门设置实用程序length(),例如性能或其他原因,例如,如果某个向量已经有一个成员函数为您提供长度:
template<> float length<Vec3C>(const Vec3C& v) {
return v.length();
}
Run Code Online (Sandbox Code Playgroud)