gpt4 book ai didi

c++ - 传递常规和右值引用参数的通用宏代码

转载 作者:行者123 更新时间:2023-11-28 03:14:19 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

关于c++ - 传递常规和右值引用参数的通用宏代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17427242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com