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 に答える