我迷失了模板。
我在标题中包含此代码:
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);
}
当第二个参数传递boost::tuples::cons
的结果时,我希望看到push()
版本的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()
函数的最常规形式,那么我的应用程序的其余代码,其中以typle作为参数调用push()
,将正确解析为{{1} }函数的版本。因此,由于某种原因,最通用的版本具有更高的优先级,这就是我不想要的。
编辑:
我想跟随Anycorn的建议,但我不是很擅长这个。我按原样离开push(lua_State * L, const boost::tuples::cons<HT, TT> & value)
版本,如果参数派生自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);
}
[切割] /home/pisto/sorgenti/hopmodv4/src/hopmod/lua/push_function.hpp:48:6:注意:模板void lua :: push(lua_State *,lua :: Luaproxy&amp;) /home/pisto/sorgenti/hopmodv4/src/hopmod/lua/push_function.hpp:51:6:注意:模板void lua :: push(lua_State *,const T&amp;,typename boost :: disable_if,T&gt;,T&gt; ::类型*) /home/pisto/sorgenti/hopmodv4/src/hopmod/lua/push_function.hpp:56:6:注意:模板void lua :: push(lua_State *,const boost :: tuples :: cons&amp;)
答案 0 :(得分:1)
这个
template<> template<typename HT, typename TT>
void push< boost::tuples::cons<HT, TT> >(lua_State * L, const boost::tuples::cons<HT, TT> & value){
push(L, value.get_head());
push(L, value.get_tail());
}
应该是
template<typename HT, typename TT>
void (lua_State * L, const boost::tuple<HT, TT> & value){
push(L, value.get_head());
push(L, value.get_tail());
}
注意make_tuple返回元组,而不是缺点。
如果我理解你的问题
更新
元组继承自利弊。如果参数不是缺点的衍生物,那么你必须做的就是通用模板失败,否则启用它。
http://www.boost.org/doc/libs/1_48_0/libs/utility/enable_if.html
或者你可以专门化元组模板函数并将元组转换为其基数cons
更新
看到你尝试做什么,你需要一种方法来测试一个元组: 让我们试试这个:
template<class T>
is_tuple : boost::mpl::false_ {};
template<class T0, class T1, ...>
struct is_tuple<tuple<T0, T1, ..> > : boost::mpl::true_ {};
然后根据元组和处理cons<H,T>
的函数写入禁用/启用功能。元组函数必须调用cons函数。