私のコードの非常に単純化されたバージョンはこれです:
#define proxy(name, type, arg) \
void name(function_list_object* obj, type arg) \
{ \
void (*foo)(type arg) = obj->find_ptr_for(STRINGIZE(name)); \
foo(arg); \
} \
proxy(fi, int, i);
これは完全に正常に機能します。ただし、C++11 の場合:
proxy(fs, std::string&&, rvrs);
std::move
...右辺値を別のレベルに転送する必要があるため、エラーが発生することが予想されます。
私はそのような解決策を考えていますが、それが常に安全かどうかはわかりません:
#if defined(MY_CXX11)
# define MY_MOVE(x) std::move(x)
#else
# define MY_MOVE(x) x
#endif
#define proxy(name, type, arg) \
void name(function_list_object* obj, type arg) \
{ \
void (*foo)(type arg) = obj->find_ptr_for(STRINGIZE(name)); \
foo(MY_MOVE(arg)); \
} \
これは、考えられるすべてのタイプで機能するように思えます。私は正しいですか?