传递常规和r值ref参数的通用宏代码

时间:2013-07-02 13:43:25

标签: c++ c++11 macros rvalue-reference

我的代码的一个非常简化的版本是:

#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)); \
    } \

在我看来,这适用于所有可能的类型。我是对的吗?

1 个答案:

答案 0 :(得分:2)

您不需要std::move。这将任何变为右值。如果函数采用左值引用(例如void foo(int&)

),它将失败

您需要std::forward,它完全按照您指定的方式转发参数 。只需指定参数需要按照给定的方式转发:std::forward<type>(arg)