【发布时间】:2017-08-02 08:00:02
【问题描述】:
考虑以下函数:
template <class T>
constexpr /* something */ f(T&& x) {
// do something
}
假设我想根据传递给名为myfunction 的函数的转发参数的类型来执行 sfinae。实现此目的的一种方法是:
template <class T>
constexpr auto f(T&& x) -> decltype(myfunction(std::forward<T>(x))) {
// do something
}
除了这样做,有没有办法在模板级别做到这一点:
// This code won't compile
template <class T, class R = decltype(myfunction(std::forward<T>(x)))>
constexpr R f(T&& x) {
// do something
}
除了我还没有访问x 的权限,所以这段代码无法编译。有没有办法仅基于T(可能使用std::declval)来实现这一点?
注意:这不是 X/Y 问题,这只是一个示例来说明这种情况发生的位置:我不知道如何在不访问变量的情况下进行 SFINAE 转发,因为对我来说std::forward 的行为是还是有点神秘。
【问题讨论】:
标签: c++ c++14 template-meta-programming perfect-forwarding trailing-return-type