众所周知,"直接"转发引用的工作方式很简单:
template<typename T>
void f(T &&t); // Here we are.
Run Code Online (Sandbox Code Playgroud)
现在,如何以间接方式使用转发引用:
template<typename T>
void f(some_class_template<T> &&f); // Here it is an rvalue reference and not universal one
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,有没有办法获得转发参考?
不,这是不可能的.如果要将函数约束为仅接受some_class_template,则必须使用类型特征:
template <typename T>
struct is_some_class_template
: std::false_type
{};
template <typename T>
struct is_some_class_template<some_class_template<T>>
: std::true_type
{};
Run Code Online (Sandbox Code Playgroud)
该特征可以以多种方式使用.一个是SFINAE:
template <typename T,
std::enable_if_t<is_some_class_template<std::decay_t<T>>::value, int> = 0>
void f(T&& f); // f is some_class_template<U> for some U
Run Code Online (Sandbox Code Playgroud)
或者您可能会发现标签调度更可取:
template <typename T>
void f_impl(T&& f, std::true_type); // f is some_class_template<U> for some U
template <typename T>
void f_impl(T&& f, std::false_type); // f is something else
template <typename T>
void f(T&& f) {
return f_impl(std::forward<T>(f), is_some_class_template<std::decay_t<T>>{});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |