Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用编译时已知的类型避免模板冗长和动态多态性_C++_Templates_Inheritance_C++11_Polymorphism - Fatal编程技术网

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) { ... }