Herb Sutter 的 C++Con 2014 演讲中的完美货运代理
Perfect forwarder in Herb Sutter's C++Con 2014 talk
在2014年C++大会上Herb Sutter的演讲中,他讨论了通过值传递、通过引用传递等等。他在这个看似做作的例子中提出的一种技术是:
using namespace std;
class employee{
string name_;
public:
template<class String, class = enable_if_t<!is_same<decay_t<String>, string>::value>>
void set_name(String&& name) noexcept(is_nothrow_assignable<string&, String>::value){
name_ = forward<String>(name);
}
};
我理解String&&
是通用或转发引用,因为String
是推导的模板类型,因此应该使用forward<String>(name)
。虽然我在模板元编程方面的经验非常有限,但我不清楚enable_if_t...
中未修改的tempate参数的目的是什么,希望能对其目的进行解释。noexcept
是如何工作的?如果有人天真地写道:
template<class String>
void set_name(String&& name){
name_ = forward<String>(name);
}
这是为了确保仅使用对std::string
的l值或r值引用来调用set_name
,从而允许使用任何cv限定符。
它使用SFINAE工作:如果String
模板参数的decay
的结果与std::string
的类型不同,则enable_if_t
将无法通过类型检查,因此模板将从候选集中删除。
由于使用了std::enable_if_t
,因此需要此未命名的模板参数。不需要参数(在模板函数中使用),因此可以对其进行命名。
CCD_ 13使用SFINAE工作。如果std::enable_if_t
的参数为false,则不会为该参数生成函数代码。
有关std::enable_if_t
的更多信息,请参阅一些文档。您还可以查看TemplateMetaProgramming的wikibook或SFINAE和enable_if文章。
相关文章:
- 代理对象的常量正确性
- 试试完美的正方形,你能给点小费吗
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 不计算一个范围内的完美数
- 具有所表示类的相同构造函数签名的代理类模板
- 完美前进使用 std::forward vs RefRefCast
- 如何编写一个完美的缩写函数模板?
- 将函数参数完美转发到函数指针:按值传递呢?
- C++20理念:要求表达和完美转发
- 完美的转发和构造函数
- 类型为 'std::map< char,int > 的 <Swig 对象的代理
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 我如何知道QNetWorkReped来自哪个代理?
- C++向量初始化遗传算法的代理向量
- 完美的广场与位明智和
- 返回值的完美转发?
- 使用衰减与完美转发
- C++封装成员的完美转发/代理
- Herb Sutter 的 C++Con 2014 演讲中的完美货运代理