我已经创建了一个物理系统来处理任何碰撞对象到任何碰撞对象,如下所示:
namespace Collision
{
template <typename T, typename U>
inline void Check(T& t, U& u)
{
if(u.CheckCollision(t.GetCollider()))
{
u.HitBy(t);
t.Hit(u);
}
}
}
Run Code Online (Sandbox Code Playgroud)
还有其他一些辅助对象使它易于使用,但要点是有动态对象需要针对静态对象和其他动态对象进行测试,但不需要检查静态对象.
我想要的是这样的:
void func()
{
PhysicsWorld world;
shared_ptr<CSphere> ballPhysics(new CSphere(0,0,ballSprite->Width()));
BallCommand ballBehavior;
CBounds bounds(0, 0, 640, 480);
CBox obstacle(200, 150, 10, 10);
Collision::Collidable<CBounds> boundC(bounds);
Collision::Collidable<std::shared_ptr<CSphere>, BallCommand&> ballC(ballPhysics, ballBehavior);
Collision::Collidable<CBox> obstC(obstacle);
world.addStatic(boundC);
world.addDynamic(ballC);
world.addStatic(obstC);
...
...
world.Update();
...
...
}
Run Code Online (Sandbox Code Playgroud)
我喜欢通过添加功能来推断容器,因此使用系统会自动更新类型列表.我想我得到了如何生成一个带有模板函数的类型列表,但不知道如何在需要它的地方获取它,或者在编译中它在什么时候完成.
如果不是那么那么一些系统使用两个类型列表然后在内部写入更新函数以遍历所有列表将它们彼此配对.
我已经阅读了一些推文MPL书,并多次阅读安德烈的书.但是,我似乎陷入了它的工作原理,并没有真正将其转化为我如何使用它.我希望他们在MPL书中再有一节关于真实世界的例子.
我已经能够将游戏引擎的所有部分与渲染,物理,碰撞(我将检测与反应分开),输入,网络,声音等进行交互.所有这些都是通用的方式.现在我只需要以通用方式保存所有内容.在完成所有这些通用工作之后,要求继承只是因为我可以在容器中保存一些东西并且我不想手动编写每个集合的可能性,因为这是泛型编程的一大优点,这将是愚蠢的.
我看到Jalf表示他/她使用MPL做类似的事情,但没有详细说明我能弄明白.如果有人知道实际使用示例或我可以获得有关使用MPL的更多信息,我将不胜感激.
再次感谢!
更新
提升MPL和提升Fusion似乎都做了我想做的事情,但是对于任何一个库的良好现实生活示例的方式似乎都很少.MPL的文档只是这个模板做到这一点,并且好运了解它的含义.融合更好一点"这是一个例子,但它只是冰山一角!"
典型的boost MPL示例是has_xxx.他们在示例中使用XXX和xxx,这使得很难看到XXX(所需文本)和Test或CheckType或更可区分的用户类型可用于代替xxx的区别.另外,没有提到这些都不在命名空间中.现在我知道为什么Scott meyers将它与Psycho中的淋浴场景进行了比较.
这真是一种耻辱,因为我编写和理解的东西确实很有用,但很难弄清楚,如果我在运输产品上,我将永远不会花费太多精力.
如果有人知道现实世界的例子或更好的参考,解释或教程,我将不胜感激.
更新
这里有更多代码:
template <typename T, …Run Code Online (Sandbox Code Playgroud) 我想让编译器为物理碰撞系统构建函数的连接.我有测试碰撞功能:
template <typename T, typename U>
inline void Collision(T& t, U& u)
{
if(u.CheckCollision(t.GetCollider()))
{
u.HitBy(t);
t.Hit(u);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我使用碰撞对象来保持碰撞对象.
template <typename T>
class Collidable
{
T m_Collider;
VictimEffect m_HitBy;
MenaceEffect m_Hit;
public:
void SetCollider(const T& t) { m_Collider = t; }
void SetVictim(VictimEffect effect) { m_HitBy = effect; }
void SetMenace(MenaceEffect effect) { m_Hit = effect; }
T& GetCollider()
{
return m_Collider;
}
template <typename V>
void HitBy(V& menace)
{
m_HitBy.HitBy(menace.GetCollider());
}
template <typename V>
void Hit(V& victim)
{ …Run Code Online (Sandbox Code Playgroud) 在下面的代码中:
template <typename T>
class CRTP
{
public:
};
template <int I, typename T>
class CRTPInt
{
public:
};
template <template <typename> class T>
class Derived : public T<Derived<T>>
{
public:
};
void main()
{
Derived<CRTP> foo;
Derived<CRTPInt<2>> foo2;
}
Run Code Online (Sandbox Code Playgroud)
如何编写 CRPTInt 以便传入一个模板化参数,然后该参数将在派生定义中继续?
谢谢,
吉姆
#include <thread>
#include <cassert>
#include <iostream>
#include <string>
#include <future>
#include <utility>
void ThFun(std::promise<std::string>&& prms)
{
std::string hello = "Hello From Future!\n";
prms.set_value(hello);
}
int main()
{
std::promise<std::string> prms;
auto ftr = prms.get_future();
std::thread th(&ThFun, std::move(prms));
std::cout << "Hello from Main\n";
std::string str = ftr.get();
std::cout << str << std::endl;
th.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到这个构建错误.
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(1140): error C2664: 'void (std::promise<_Ty> &&)' : cannot convert parameter 1 from 'std::promise<_Ty>' to 'std::promise<_Ty> &&'
1> with
1> [ …Run Code Online (Sandbox Code Playgroud) 我试图测试各种指针速度的速度,并遇到一个非常奇怪的问题.在分配原始指针时,它运行正常.(存在内存泄漏,但这不是问题.)当我使用shared_ptr运行第二次测试时,它运行填充精细,打印日志,然后当它返回时,它进入无限循环.看起来ref计数是垃圾,但我正在按价值做所有事情.
#include <memory>
#include <vector>
#include <functional>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <string>
#include <Windows.h>
using namespace std;
static const int TOTAL = 1000000;
int* newTest(int i)
{
return new int(i);
}
shared_ptr<int> sharedTest(int i)
{
return shared_ptr<int>(new int(i));
}
template <typename T>
pair<int, vector<typename T::result_type>> Fill(T fn)
{
unsigned long start = GetTickCount();
vector<typename T::result_type> vec;
vec.reserve(TOTAL);
for(int i = 0; i < TOTAL; i++)
{
vec.push_back(fn(i));
}
unsigned long end = GetTickCount();
return make_pair(end - start, …Run Code Online (Sandbox Code Playgroud) 从VC10移动到VC11时,以下代码无法编译.
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
using namespace std::placeholders;
typedef std::function<void(int)> CB;
int main()
{
vector<CB> m_CBs;
int m_LongPressGesture;
for_each(m_CBs.begin(), m_CBs.end(), bind(&CB::operator(), _1, m_LongPressGesture));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误输出是非法间接的.这是完整的输出.
1>------ Build started: Project: CompileError, Configuration: Debug Win32 ------
1>Build started 2/12/2013 4:32:56 PM.
1>InitializeBuildStatus:
1> Touching "Debug\CompileError.unsuccessfulbuild".
1>ClCompile:
1> main.cpp
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(1269): error C2100: illegal indirection
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(1152) : see reference to function template instantiation '_Rx std::_Pmf_wrap<_Pmf_t,_Rx,_Farg0,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t,_V5_t,<unnamed-symbol>>::operator ()<std::function<_Fty>>(_Wrapper …Run Code Online (Sandbox Code Playgroud) c++ ×7
c++11 ×4
templates ×3
visual-c++ ×3
std ×2
boost-mpl ×1
crtp ×1
game-physics ×1
lldb ×1
xcode ×1