gpt4 book ai didi

c++ - 模板模板参数的通用引用

转载 作者:可可西里 更新时间:2023-11-01 16:36:54 26 4
gpt4 key购买 nike

是否可以通过通用引用传递模板模板参数值?例如,考虑这个函数(不)在 STL 序列上工作的最小示例:

#include <iostream>
#include <vector>

template < template<typename,typename> class C, template<typename> class A, typename T >
void func(C<T, A<T>>&& c) {
// usually I'd std::forward here, but let's just use cout...
std::cout << c.size() << "\n";
}

int main (int argc, char const* argv[]) {
func(std::vector<float>(2));
std::vector<float> lv(3);
func(lv);
}

它不会编译,因为编译器不知道如何在第二次调用 func 时绑定(bind)左值 ("lv")。关于C类型的推导规则,我有点迷茫。谁能赐教?

编辑:虽然我猜这与问题无关:我使用了 g++ 4.9 和 clang 3.5(两个 repo HEAD)

最佳答案

“通用引用”是一种俗语,严格来说,它始终意味着引用 T &&,其中 T 是一个推导模板参数.

不过,您可以修改您的代码,以仅使用它:

template <typename T>
void func(T && c) { /* ... std::forward<T>(c) ... */ }

如果你关心 T 是指定的形式,添加一个特征:

#include <type_traits>

template <typename T>
typename std::enable_if<IsATemplate<typename std::decay<T>::type>::value>::type
func(T && c) { /* ... std::forward<T>(c) ... */ }

编写 IsATemplate 特性留作练习。

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

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