Tob*_*ull 2 c++ templates sfinae overload-resolution
考虑以下代码。
struct Widget {
int& get();
};
template<typename X>
auto func_1(X& x) {
return x.get();
}
template<typename X>
auto func_2(X& x) -> decltype(x.get()) {
return x.get();
}
Run Code Online (Sandbox Code Playgroud)
当使用 type 的左值调用时Widget,该函数func_1将使用返回类型进行实例化int,其中函数func_2将具有返回类型int&。
func_1另外,和之间存在差异,func_2因为“表达式 SFINAE”是针对 执行的func_2。因此,对于X没有.get()成员的类型,func_2将不会参与重载决策。
我的问题是:我们如何func_1在执行表达式 SFINAE 的同时获得返回类型行为?
以下func_3似乎适用于我测试的情况,但我觉得应该有一个更简单的替代方案。另外,我不确定是否func_3具有与所有情况下完全相同的返回类型func_1。
template<typename X>
auto func_3(X& x) -> std::remove_cvref_t<std::decay_t<decltype(x.get())>> {
return x.get();
}
Run Code Online (Sandbox Code Playgroud)
只std::decay_t<decltype(x.get())>需要就够了。或者std::remove_cvref_t<decltype(x.get())>(后者不执行数组/函数到指针衰减)。
或者,在 C++23 中您可以使用decltype(auto(x.get())).
但如果您要包装一个函数,通常普通decltype的更正确(例如,在您的情况下,如果get()返回引用,则auto强制复制)。
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |