Vin*_*ent 3 c++ template-meta-programming perfect-forwarding trailing-return-type c++14
考虑以下功能:
template <class T>
constexpr /* something */ f(T&& x) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
并且假设我想根据传递给被调用函数的转发参数的类型来做sfinae myfunction.实现这一目标的一种方法是:
template <class T>
constexpr auto f(T&& x) -> decltype(myfunction(std::forward<T>(x))) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
而不是这样做,有没有办法在模板级别执行此操作:
// This code won't compile
template <class T, class R = decltype(myfunction(std::forward<T>(x)))>
constexpr R f(T&& x) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
除了我还没有访问权限,x所以这段代码不会编译.有没有办法只基于T(可能使用std::declval)来实现这一目标?
注意:这不是一个X/Y问题,它只是一个例子来说明这种情况发生的地方:我不知道如何在不访问变量的情况下进行转发SFINAE,因为对我而言,行为std::forward仍然有点神秘.
是的,std::declval确实是关键:
template <class T, class R = decltype(myfunction(std::declval<T>()))>
constexpr R f(T&& x) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
这将是SFINAE输出或R将myfunction是所选择的任何过载的返回类型.
你的问题让我觉得你需要复习一下参考折叠的工作原理; 我建议在该领域阅读(这似乎是一个很好的起点).
| 归档时间: |
|
| 查看次数: |
175 次 |
| 最近记录: |