c++ - 间接转发引用

标签 c++ c++14

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

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

关于c++ - 间接转发引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49244948/

相关文章:

C++ 内存垃圾处理

c++ - Lambda 表达式作为类模板参数

C++17 if constexpr() 与元组一起使用

c++ - 为动态矩阵类实现自定义迭代器

C++ 模板类引用传递引用

c++ - std::async 似乎没有使用 std::launch::async 生成线程

C++动态链接库和void指针

templates - 通过函数指针函数将lambda作为模板参数传递给模板

c++ - 继续延续 monad 元组。怎么了?

c++ - 将别名模板转换为别名类型