在编写包装 Lua 的代码时,我遇到了传递字符串文字的需求,并开始想知道哪种方式最有效。
我可以在两个功能之间进行选择:
void lua_pushstring (lua_State* L, const char* str);
void lua_pushlstring(lua_State* L, const char* str, size_t len);
当然,第一个函数在strlen()
内部使用,因此第二个更快。
现在,如果它在编译时已知,我想避免计算字符串长度,如此处和此处所述:
// 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");
当然,使用 a 调用时它不会编译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
,因此永远不会被调用。
有没有聪明的方法来解决这个问题?