C++ &引用;“衰退”;模板化名

C++ &引用;“衰退”;模板化名,c++,c++17,template-argument-deduction,template-templates,C++,C++17,Template Argument Deduction,Template Templates,这是一个后续行动 我有一个带模板参数的模板类型 模板 结构化垃圾邮件{ 模板 使用温度=容器; }; 我想编写一个(模板化)函数,它接受一个spam实例并返回一个类型稍有不同的spam实例。我想从输入中维护容器模板参数,并且只指定NUMBERTYPE。() #包括 #包括 模板 结构化垃圾邮件{ 模板 使用温度=容器; }; 模板 自动功能(T英寸){ 垃圾邮件检索; 返回返回; } int main(){ 垃圾邮件一个; //spam二=功能(一); 自动二=功能(一); 返回0; } 这

这是一个后续行动

我有一个带模板参数的模板类型

模板
结构化垃圾邮件{
模板
使用温度=容器;
};
我想编写一个(模板化)函数,它接受一个
spam
实例并返回一个类型稍有不同的
spam
实例。我想从输入中维护
容器
模板参数,并且只指定
NUMBERTYPE
。()

#包括
#包括
模板
结构化垃圾邮件{
模板
使用温度=容器;
};
模板
自动功能(T英寸){
垃圾邮件检索;
返回返回;
}
int main(){
垃圾邮件一个;
//spam二=功能(一);
自动二=功能(一);
返回0;
}
这基本上是可行的,但我想通过接收预期的
spam
而不是接受
auto
返回来检查
function()
是否返回我预期的类型。非自动版本无法编译,因为

<source>:18:45: error: conversion from 'spam<spam<std::vector, float>::Temp,[...]>' to non-scalar type 'spam<std::vector,[...]>' requested

     spam<std::vector, double> two = function(one);

                                     ~~~~~~~~^~~~~
:18:45:错误:请求从“垃圾邮件”转换为非标量类型的“垃圾邮件”
spam二=功能(一);
~~~~~~~~^~~~~
i、 e.
spam
spam
之间不匹配,尽管我预计
spam::Temp
std::vector
相同。(事实上,我可以检查
std::is_same\u v
是否确实正确-即,在为
Temp
提供模板参数后,我已经预期/期望了行为,只是我正在贡献的代码主要与未解析的
容器一起工作)

问题:是否有一种方法可以将
T::Temp
规范化为任何类型,并从类型中删除
spam::Temp

问题:是否有一种方法可以将T::template Temp规范化为任何形式,并从类型中删除spam::Temp

不,据我所知

但在这种情况下,这是不必要的,因为您可以重写
function()
来截取模板参数
容器

我的意思是:你可以重写
function()
如下

template <template <typename...> class C, typename N>
spam<C, double> function (spam<C, N> const &)
 { return {}; }
模板
垃圾邮件功能(垃圾邮件常量&)
{返回{};}
下面是一个完整的编译示例

#include <type_traits>
#include <vector>

template <template <typename...> class CONTAINER, typename NUMBERTYPE>
struct spam
 {
   template <typename T>
   using Temp = CONTAINER<T>;
 };

template <template <typename...> class C, typename N>
spam<C, double> function (spam<C, N> const &)
 { return {}; }

int main() {
    spam<std::vector, float> one;
    spam<std::vector, double> two = function(one);
    auto three = function(one);
}
#包括
#包括
模板
结构化垃圾邮件
{
模板
使用温度=容器;
};
模板
垃圾邮件功能(垃圾邮件常量&)
{返回{};}
int main(){
垃圾邮件一个;
spam二=功能(一);
自动三=功能(一);
}

并不是说这个挑剔对你有帮助,而是
T::template Temp
不是一种类型,与你最后一句话所说的相反。