从模板类型而不是参数获取转发类型

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仍然有点神秘.

ild*_*arn 5

是的,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输出或Rmyfunction是所选择的任何过载的返回类型.

你的问题让我觉得你需要复习一下参考折叠的工作原理; 我建议在该领域阅读(似乎是一个很好的起点).