繁体   English   中英

间接转发参考

[英]Indirect forwarding references

众所周知,“直接”转发引用的工作方式很简单:

template<typename T>
void f(T &&t); // Here we are.

现在,如何间接使用转发引用:

template<typename T>
void f(some_class_template<T> &&f); // Here it is an rvalue reference and not universal one

在第二种情况下,是否可以使用转发参考?

不,这是不可能的。 如果要限制函数只接受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
{};

该特征可以以多种方式使用。 一个是与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

或者,您可能会发现标签分发更可取:

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>>{});
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM