A bizarre C++ wart wants us to declare FromStack overloads
before the ThemeMetric templates that use them. That's broken and unreasonable, so change this around a bit and make FromStack (and Push) templates. Push() takes a bit of a trick. Some Push overloads push the actual value: scalars (int, float), RageColor (pushes a table). Others--most of them--push a reference to a C++ object. We want the scalars to have a reference parameter type, so we don't make extra copies of things like RageColor when we push them. We need to pass C++ objects by pointer (we need to push the actual object's pointer, not a pointer to a copy). Further, pushing a scalar is a const operation, but pushing a reference to an object is not. To do both with the same template, we handle objects with this slightly odd template: template<> void LuaHelpers::Push<T*>( lua_State *L, T *const &pObject ); The actual overload (T) is eg. "Actor*"; this fits within the general prototype, "Push(lua_State *L, const T &object)", giving us a const reference to a (non-const) pointer to Actor, and we're conceptually pushing the pointer. The net effect of this is that 1: what was before compile errors now becomes link time errors, but 2: these specializations don't have to be in the headers (except for new ones for Preference and BroadcastOnChange).
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
#ifndef MessageManager_H
|
||||
#define MessageManager_H
|
||||
|
||||
#include "LuaManager.h"
|
||||
struct lua_State;
|
||||
|
||||
enum Message
|
||||
@@ -201,6 +202,8 @@ public:
|
||||
bool operator != ( const T &other ) const { return val != other; }
|
||||
};
|
||||
|
||||
namespace LuaHelpers { template<class T> void Push( lua_State *L, const BroadcastOnChange<T> &Object ) { LuaHelpers::Push<T>( L, Object.Get() ); } }
|
||||
|
||||
template<class T, int N>
|
||||
class BroadcastOnChange1D
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user