在推导模板模板形参时,模板实参推导始终不推导别名模板。是什么意思?请给出对应代码
时间: 2024-03-26 17:41:26 浏览: 20
这句话的意思是:在进行模板实参推导时,如果模板形参是一个别名模板,则不会对其进行推导。也就是说,在模板实例化时,如果模板形参是一个别名模板,则实参的类型不会被推导,而是直接使用别名模板的名称来进行实例化。
下面是一个示例代码,说明这个问题:
```cpp
template<typename T>
using AliasTemplate = std::vector<T>;
template<typename T>
void func(T t, AliasTemplate<T> at) {}
int main() {
std::vector<int> vec{1, 2, 3};
func(1, vec); // 编译通过
func(vec, vec); // 编译失败,因为 at 无法推导出实参类型
return 0;
}
```
在上面的代码中,`AliasTemplate` 是一个别名模板,它将 `std::vector` 重命名为 `AliasTemplate`。在调用 `func` 函数时,第一个实参是 `1`,可以被推导为 `int` 类型,而第二个实参是 `vec`,它是一个 `std::vector<int>` 类型,也可以被推导为 `AliasTemplate<int>` 类型。但是,当我们尝试将 `vec` 作为第一个实参传入 `func` 时,由于 `AliasTemplate` 是一个别名模板,无法被推导出实参类型,导致编译失败。
相关问题
在推导模板模板形参时,模板实参推导始终不推导别名模板。是什么意思?请给出对应代码 请注意问题
在C++中,有一个模板模板参数的概念。当使用模板模板参数时,模板实参推导不会推导别名模板,而是推导其对应的模板参数。
举个例子,假设我们有以下的别名模板:
```c++
template<typename T>
using MyVector = std::vector<T>;
```
现在我们定义了一个以模板模板参数的形式使用MyVector的函数模板:
```c++
template<template<typename> typename Container, typename T>
void foo(Container<T> c) {
// ...
}
```
那么,当我们调用foo函数时,模板实参推导不会推导MyVector,而是推导std::vector作为Container的模板参数:
```c++
MyVector<int> vec{1, 2, 3};
foo(vec); // 推导出Container为std::vector,T为int
```
因此,尽管MyVector是std::vector的别名模板,但在模板实参推导时并不会被推导。
需要注意的是,这里的模板模板参数必须使用template<typename> typename的形式,而不能使用template<typename T> template<typename>的形式,因为后者在模板实参推导时会推导别名模板。
为CPPReference中提及的"各类型模板形参提供的所有模板实参的类型(跳过非类型模板形参和模板模板形参)",应该如何理解,是否能提供对应的代码
这个问题涉及到C++模板的类型参数和非类型参数。在C++中,模板参数可以是类型参数(例如`typename T`)或非类型参数(例如`int N`)。然后,C++中的模板实参可以是具体的类型或值。
在这个问题中,"各类型模板形参提供的所有模板实参的类型"指的是模板的类型参数,因为模板的非类型参数不能提供类型。并且,"跳过非类型模板形参和模板模板形参"意味着我们只考虑类型模板形参。
为了更好地理解这个问题,我们可以看一个例子:
```cpp
template<typename T, int N, template<typename> class Container>
class MyClass {
// ...
};
```
在这个例子中,我们有三个模板形参:`T`是一个类型参数,`N`是一个非类型参数,`Container`是一个模板模板参数。因此,我们只考虑`T`这个类型模板形参,而跳过`N`和`Container`。
现在,如果我们实例化`MyClass`模板,比如这样:
```cpp
MyClass<int, 5, std::vector> obj;
```
我们提供了三个模板实参:`int`是一个类型实参,`5`是一个非类型实参,`std::vector`是一个模板模板实参。因此,我们只考虑`int`这个类型实参,而跳过`5`和`std::vector`。
总之,对于一个模板,"各类型模板形参提供的所有模板实参的类型"指的是模板的类型参数,而不包括非类型参数和模板模板参数。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)