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
不是一种类型,与你最后一句话所说的相反。