#include <iostream>
#include <vector>
struct lua_State {};
template <class T>
class Data
{
public:
static T& storedValueFromLuaStack(lua_State* state, int index)
{
static T a{};
return a;
}
static Data<T> fromLuaStack(lua_State* state, int index)
{
return Data<T>{};
}
};
template <class U>
class interpretValueReturnType
{
public:
interpretValueReturnType(lua_State *state, int index) : state(state), index(index) {}
operator U& () &&
{
return Data<U>::storedValueFromLuaStack(state, index);
}
operator Data<U> () &&
{
return Data<U>::fromLuaStack(state, index);
}
private:
lua_State *state;
int index;
};
template <class U>
interpretValueReturnType<U> interpretValue(lua_State *state, int index)
{
return interpretValueReturnType<U>(state, index);
}
int main() {
lua_State *state;
int& a = interpretValue<int>(state, 1);
Data<int> b = interpretValue<int>(state, 1);
auto c = interpretValue<float>(state, 1);
float& d = std::move(c);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKc3RydWN0IGx1YV9TdGF0ZSB7fTsKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIERhdGEKewpwdWJsaWM6CglzdGF0aWMgVCYgc3RvcmVkVmFsdWVGcm9tTHVhU3RhY2sobHVhX1N0YXRlKiBzdGF0ZSwgaW50IGluZGV4KQoJewoJCXN0YXRpYyBUIGF7fTsKCQlyZXR1cm4gYTsKCX0KCXN0YXRpYyBEYXRhPFQ+IGZyb21MdWFTdGFjayhsdWFfU3RhdGUqIHN0YXRlLCBpbnQgaW5kZXgpCgl7CgkJcmV0dXJuIERhdGE8VD57fTsKCX0KfTsKCnRlbXBsYXRlIDxjbGFzcyBVPgpjbGFzcyBpbnRlcnByZXRWYWx1ZVJldHVyblR5cGUKewpwdWJsaWM6CglpbnRlcnByZXRWYWx1ZVJldHVyblR5cGUobHVhX1N0YXRlICpzdGF0ZSwgaW50IGluZGV4KSA6IHN0YXRlKHN0YXRlKSwgaW5kZXgoaW5kZXgpIHt9CgkKCW9wZXJhdG9yIFUmICgpICYmCgl7CgkJcmV0dXJuIERhdGE8VT46OnN0b3JlZFZhbHVlRnJvbUx1YVN0YWNrKHN0YXRlLCBpbmRleCk7Cgl9CgkKCW9wZXJhdG9yIERhdGE8VT4gKCkgJiYKCXsKCQlyZXR1cm4gRGF0YTxVPjo6ZnJvbUx1YVN0YWNrKHN0YXRlLCBpbmRleCk7Cgl9CnByaXZhdGU6CglsdWFfU3RhdGUgKnN0YXRlOwoJaW50IGluZGV4Owp9OwoKdGVtcGxhdGUgPGNsYXNzIFU+CmludGVycHJldFZhbHVlUmV0dXJuVHlwZTxVPiBpbnRlcnByZXRWYWx1ZShsdWFfU3RhdGUgKnN0YXRlLCBpbnQgaW5kZXgpCnsKCXJldHVybiBpbnRlcnByZXRWYWx1ZVJldHVyblR5cGU8VT4oc3RhdGUsIGluZGV4KTsKfQoKaW50IG1haW4oKSB7CglsdWFfU3RhdGUgKnN0YXRlOwoJaW50JiBhID0gaW50ZXJwcmV0VmFsdWU8aW50PihzdGF0ZSwgMSk7CglEYXRhPGludD4gYiA9IGludGVycHJldFZhbHVlPGludD4oc3RhdGUsIDEpOwoJCglhdXRvIGMgPSBpbnRlcnByZXRWYWx1ZTxmbG9hdD4oc3RhdGUsIDEpOwoJZmxvYXQmIGQgPSBzdGQ6Om1vdmUoYyk7Cn0=