我的代码的一个非常简化的版本是:
#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
将rvalue转移到另一个级别。
我正在考虑这样的解决方案,但我不确定它是否总是安全的:
#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)); \
} \
在我看来,这适用于所有可能的类型。我是对的吗?
答案 0 :(得分:2)
您不需要std::move
。这将任何变为右值。如果函数采用左值引用(例如void foo(int&)
。
您需要std::forward
,它完全按照您指定的方式转发参数 。只需指定参数需要按照给定的方式转发:std::forward<type>(arg)
。