【发布时间】:2012-06-07 14:21:23
【问题描述】:
在编写包装 Lua 的代码时,我遇到了传递字符串文字的需求,并开始想知道哪种方式最有效。
我有两种功能可供选择:
void lua_pushstring (lua_State* L, const char* str);void lua_pushlstring(lua_State* L, const char* str, size_t len);
当然,第一个函数在内部使用strlen(),因此第二个更快。
现在,如果在编译时已知,我想避免计算字符串长度,如 here 和 here 所示:
// Overload 1
template <size_t N>
inline void pushstring(lua_State* L, const char (&str) [N])
{
lua_pushlstring(L, str, N-1);
}
这个函数在使用字符串字面量调用时可以正常工作:pushstring(L, "test"); 当然,在使用const char* 调用时它不会编译,例如在.cpp 文件中的较长函数中:
// this is in a .cpp file
void long_function(lua_State* L, const char* str)
{
// do lots of stuff
pushstring(L, str); // compile error
// do more stuff
}
现在如果我添加
// Overload 2
inline void pushstring(lua_State* L, const char* str)
{
lua_pushstring(L, str);
}
由于某种原因(C++ 重载解析很棘手),它优先于 Overload 1,因此永远不会被调用。
有没有聪明的方法来解决这个问题?
【问题讨论】:
-
我尝试了类似你的东西:ideone.com/Tb4mq也许这会给你灵感。
-
@Nobody:这应该是答案:)