提供功能版本,其中可用值和参考
Providing functions versions where both by value and by reference are available
我定义了此功能:
template <typename T>
void foo (T &result){
//some very complicate stuff
result = //something
}
现在,假设有时我想用T=int
和T=std::string
称呼它。因此,在第二种情况下,标题是有效的,但是使用T=int
,这是效率低下的。请注意,我仅以这两种类型为例。
因此,更好的解决方案将通过以下方式定义另一个功能:
template <typename T>
T foo(){
T result;
//some very complicate stuff
return result;
}
让用户决定要拨打哪个版本,但是我们如何避免在函数中调用//some very complicate stuff
的整个代码?
但是使用
T=int
这是效率低下的
启用了编译器的优化,这很可能永远不会重要 - 可以通过分析并分别处理它至关重要的情况。
但是,我们如何避免在功能中调用
//some very complicate stuff
的整个代码?
好吧,避免它的一种可能的方法将需要您将函数对象作为额外参数:
template <typename T, typename F>
void foo (T &result, F&& complicated_stuff){
std::forward<F>(complicated_stuff)();
result = //something
}
template <typename T, typename F>
T foo(F&& complicated_stuff){
T result;
std::forward<F>(complicated_stuff)();
return result;
}
这是一个很好的解决方案,很可能会被编译器隔离和优化...但是,如果您要做的只是避免通过参考传递原始类型,那有什么意义呢?我们在此处为 function对象。。。
因此,我强烈建议您只有一个foo
的单个版本。按值返回的一个更惯用的C 11,并且不会比RVO和移动语义引起的参考的一个较慢。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- C++错误消息*成员参考.**初学者*
- 是否有一种方法可以避免在RVALUE和LVALUE参考中创建功能时避免重复的代码
- 模板功能不使用RVALUE参考实例化/接收呼叫
- 如何编写工厂功能以在C 中初始化constexpr参考
- 如何检查正确操作数以通过参考返回功能
- C 超载相等运算符.我应该写自己的功能以接受通过参考或值传递的参数
- Lambda通过参考传递的功能
- 提供功能版本,其中可用值和参考
- C 功能具有参考参数错误的迭代器错误.寻求解释
- CLION不确定对功能的参考
- C 性能:通过参考通过对象与功能的对象传递
- rvalue参考绑定到std ::功能类型的LVALUE
- 编译器无法在循环递归参考中找到功能
- 通过参考辅助功能传递随机数生成器MT19937是正确的吗?
- 通过递归模板中的参考传递模板功能
- 从基本指针/参考调用正确的免费功能
- 我在哪里可以找到一个官方的参考资料,列出了上交所的内在功能的运作