How does c++11 std::ref work?
How does c++11 std::ref work?
我的任务是实现我自己的std :: ref函数。我知道有一个Reference_wrapper functor,它有助于STD ::参考。但是我该如何实施这些功能/类。我考虑以下内容:
template <class T>
struct myreference_wrapper{
T& functor;
myreference_wrapper(T& t):functor(t){}
void operator()('parameter') {
functor('parameter');
};
};
template<class T>
myreference_wrapper<T> myref(T& t){
myreference_wrapper<T> functor(t);
return functor;
}
当我们调用MyRef时,我们无法使用模板参数,因为STD :: REF不使用模板参数。但是,当我们调用operator((时,我们需要知道其参数,因为我们要将它们传递给函数运算符(((我用'parameter'签名(。STD :: ref无需任何模板参数吗?
模板函数可以从调用函数的类型中推导模板参数。例如:
template <class T> T min(T a, T b) {
return a < b ? a : b;
}
当您调用此功能时,您不需要指定模板参数:
int x = min(1, 2);
编译器查看函数参数的类型,发现它们既是int
,又结论一下它需要调用min<int>
。
呼叫myref
模板功能的同一件事:
int i;
myref(i);
再次,编译器查看函数参数的类型,看到它是int
,并得出结论,它需要调用myref<int>
。
顺便说一句,上面的min
功能可能更复杂。min(1, 2.0)
不会编译,因为两个函数参数类型是不同的。一个是int
,一个是double
,因此没有与两者完全匹配的T。这里有几种可能的解决方案。一种是重写模板函数,以便具有两个模板类型参数,而不是一个:template <class T0, class T1> ??? min(T0, T1)
。这导致了设计问题:正确的回报类型是什么?另一个解决方案是将调用代码更改以传递相同类型的参数。另一个是明确给出模板参数类型:min<int>(1, 2.0)
。该代码说要调用min<int>
,该代码采用了int
类型的两个参数;双重将转换为 int
,就像对占两个int
值的非模板函数一样。
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 将Ref对象作为类成员
- 为什么我的 std::ref 无法按预期工作?
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何@ref同一方法的不同变体?
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- 为什么要用 ref-qualifier 和
- 将 ArrayXd 传递给 const VectorXd& 和 const Ref<const VectorXd>&
- 返回 Eigen::Ref 合法吗?
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- 使用 const char* 初始化 const ref 字符串成员时幕后会发生什么
- 为什么添加析构函数(甚至是空的)会破坏我的结构,该结构使用 ref 转发和折叠来保存 ref 或值的副本?
- 在与Odint组合的类中使用特征矩阵Ref
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- 带有自定义deleter的std::unique_ptr对象的大小(一个由ref捕获的lambda)
- 正在通过const-ref未定义的行为捕获新构造的对象
- C++将包含的库 (ref DLL) 从根目录更改为另一个位置
- 无法修改其他线程中 ref 传递的值
- How does c++11 std::ref work?