gpt4 book ai didi

c++ - 转发引用和模板模板

转载 作者:搜寻专家 更新时间:2023-10-31 00:30:48 29 4
gpt4 key购买 nike

考虑这两个模板函数:

template<typename T>
void foo(T&& bar) {
// do stuff with bar, which may or may not be an instance of a templated class
}

template<typename U, template<typename> class T>
void foo(T<U>&& bar) {
// do stuff with bar, which must be an instance of a templated class
}

为什么前者接受左值(通过使用转发引用)而后者不接受?


看起来像Can an identity alias template be a forwarding reference?可能也与此有关,但它似乎涵盖了转发引用限制的不同方面。

最佳答案

如果你想保留一个转发引用参数,同时推导一个参数的类型,你可以使用下面的解决方案:

#include <type_traits>
#include <utility>

template <typename T>
struct tag {};

template <typename T, typename U, template <typename> class C>
void foo(T&& t, tag<C<U>>)
{

}

template <typename T>
auto foo(T&& t)
-> decltype(foo(std::forward<T>(t), tag<typename std::decay<T>::type>{}))
{
return foo(std::forward<T>(t), tag<typename std::decay<T>::type>{});
}

DEMO

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com