【发布时间】:2012-01-30 21:48:11
【问题描述】:
我迷失了模板。
我在标题中有这段代码:
void push(lua_State *, bool);
void push(lua_State *, int);
void push(lua_State *, long);
void push(lua_State *, unsigned long);
void push(lua_State *, lua_Number);
void push(lua_State *, lua_CFunction);
void push(lua_State *, const char *);
void push(lua_State *, const char *, std::size_t);
void push(lua_State *, const std::string &);
template<typename T>
void push(lua_State * L, const std::vector<T> & value)
{
lua_newtable(L);
std::size_t size = value.size();
for(unsigned int i = 0; i < size; i++)
{
lua_pushinteger(L, i + 1);
push(L, value[i]);
lua_settable(L, -3);
}
}
inline void push(lua_State *, boost::tuples::null_type){}
inline void push(lua_State *, boost::tuple<>){}
template<typename HT, typename TT>
void push(lua_State * L, const boost::tuples::cons<HT, TT> & value){
push(L, value.get_head());
push(L, value.get_tail());
}
//Declared but not defined. *Intentional* compile-time error if trying to push a Luaproxy (undefined reference). Use Lua stack reference instead
template<typename T>
void push(lua_State* l, Luaproxy<T>& value);
template<typename T> //most generic version
void push(lua_State* l, T& value){
Luaproxy<T>::new_c(l, value, false);
}
我希望看到push() 的boost::tuples::cons 版本在作为第二个参数传递boost::make_tuple(...) 的结果时被调用。但我在链接时遇到错误,表明此类调用已解析为push 的最通用版本,即push(lua_State* l, T& value)。
最后的结果是我一定能做到
mystruct example;
push(l, boost::make_tuple(3, 4, example))
这必须依次调用
void push(lua_State * L, const boost::tuples::cons<HT, TT> & value) //tuple contains int, int, mystruct
void push(lua_State *, int)
void push(lua_State * L, const boost::tuples::cons<HT, TT> & value) //my tuple contains int mystruct
void push(lua_State *, int)
void push(lua_State * L, const boost::tuples::cons<HT, TT> & value) //my tuple contains mystruct
void push(lua_State* l, T& value)
如果我删除了我的push() 函数的最一般形式,我的应用程序的其余代码,其中它以一个类型作为参数调用push(),将正确地解析为函数的push(lua_State * L, const boost::tuples::cons<HT, TT> & value) 版本。所以,出于某种原因,最通用的版本具有更高的优先级,这就是我不想要的。
编辑:
我正在尝试遵循 Anycorn 的建议,但我对此并不擅长。我将保留boost::tuples::cons 版本,如果参数派生自boost::tuples::cons,我想禁用通用版本:
template<typename T, typename HT, typename TT>
void push(lua_State* l, T& value, typename boost::disable_if<boost::is_base_of< boost::tuples::cons<HT, TT>, T>, T>::type* =0 ){
Luaproxy<T>::new_c(l, value, false);
}
它仍在考虑 push(l, boost::make_tuple(mystruct)) 的 cons 类型
[剪切] /home/pisto/sorgenti/hopmodv4/src/hopmod/lua/push_function.hpp:48:6: 注意:模板无效 lua::push(lua_State*, lua::Luaproxy&) /home/pisto/sorgenti/hopmodv4/src/hopmod/lua/push_function.hpp:51:6: 注意:模板 void lua::push(lua_State*, const T&, typename boost::disable_if, T>, T>: :类型*) /home/pisto/sorgenti/hopmodv4/src/hopmod/lua/push_function.hpp:56:6: 注意:模板 void lua::push(lua_State*, const boost::tuples::cons&)
【问题讨论】:
-
似乎您正在尝试对功能进行部分专业化-您不能