0

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

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

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

4

1 回答 1

2

你不需要std::move。这会将任何东西变成右值。如果函数采用左值引用,它将失败,例如void foo(int&).

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

于 2013-07-02T14:03:18.270 回答