Lua をラップするコードを書いているときに、文字列リテラルを渡す必要があることに気づき、どの方法が最も効率的か疑問に思い始めました。
次の 2 つの機能から選択できます。
void lua_pushstring (lua_State* L, const char* str);
void lua_pushlstring(lua_State* L, const char* str, size_t len);
もちろん、最初の関数はstrlen()
内部的に使用するため、2 番目の関数の方が高速です。
ここで、コンパイル時にわかっている場合は、こことここに示されているように、文字列の長さの計算を避けたいと思います。
// 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
ため、呼び出されることはありません。
それを修正する賢い方法はありますか?