C++ 使用编译时已知的类型避免模板冗长和动态多态性
在我的中,我允许用户创建/指定首选的空间分割方法和首选的分辨率方法 下面是一个空间分区的示例C++ 使用编译时已知的类型避免模板冗长和动态多态性,c++,templates,inheritance,c++11,polymorphism,C++,Templates,Inheritance,C++11,Polymorphism,在我的中,我允许用户创建/指定首选的空间分割方法和首选的分辨率方法 下面是一个空间分区的示例 struct SpatialBase { virtual void a() = 0; virtual void b() = 0; ... }; struct Grid2D : public SpatialBase { ... override a() and b() ... }; struct QuadTree : public SpatialBase { ... overri
struct SpatialBase
{
virtual void a() = 0;
virtual void b() = 0;
...
};
struct Grid2D : public SpatialBase { ... override a() and b() ... };
struct QuadTree : public SpatialBase { ... override a() and b() ... };
struct World
{
std::vector<std::unique_ptr<Body>> bodies;
std::unique_ptr<SpatialBase> spatial;
...
World(SpatialBase* mSpatial, ...) : spatial(mSpatial), ... { }
};
auto world1{new World{new Grid2D{...}, ...}};
auto world2{new World{new QuadTree{...}, ...}};
有没有办法隐藏Grid2D
和pulsures
类型?只有在创建世界时才需要知道它们。但是Body
还必须知道这些类型,因为它需要对空间分区方法实例和解析方法实例的引用
所需的代码示例:
World world1{new World<Grid2D, ImpulseRes>(...)};
Body& body1{world1.createBody()};
void useBody(Body& mBody) { ... }
世界1{新世界(…)};
Body&body1{world1.createBody()};
void useBody(Body&mBody){…}
我不知道您的代码是如何划分的,但是如果您在实例化body1
之后声明了您的函数,也许您可以使用decltype
:
auto& body1 = world1.createBody();
using body_type = decltype(body1);
void useBody(body_type& b) { ... }
我想你想要的是一个好的老式的typedef
typedef basic_world<grid2d, impulse_res> world;
typedef basic_body<world> body;
world world1(...);
void useBody(body& bdy) { ... };
typedef基本世界;
typedef基本体;
世界1(……);
void useBody(body&bdy){…};
您可以使用
template <class TGrid, class TImpulse>
void useBody(Body<TGrid, TImpulse>& mBody) { ... }
模板
void useBody(Body&mBody){…}
或
模板
void useBody(TBody和mBody){…}
template <class TGrid, class TImpulse>
void useBody(Body<TGrid, TImpulse>& mBody) { ... }
template <class TBody>
void useBody(TBody& mBody) { ... }