这是对这个问题的后续说明。
我有一个具有模板模板参数的模板类型。
我想编写一个(模板)函数,它接受一个
我有一个不匹配的问题,即
问题: 有没有一种方法将
我有一个具有模板模板参数的模板类型。
template <template <typename...> class CONTAINER, typename NUMBERTYPE>
struct spam {
template <class T>
using Temp = CONTAINER<T>;
};
我想编写一个(模板)函数,它接受一个
spam
实例并返回一个稍微不同类型的 spam
实例。我想保留输入的 CONTAINER
模板参数,并只指定 NUMBERTYPE
。(godbolt 链接)#include <type_traits>
#include <vector>
template <template <typename...> class CONTAINER, typename NUMBERTYPE>
struct spam {
template <class T>
using Temp = CONTAINER<T>;
};
template <typename T>
auto function(T in) {
spam<T::template Temp, double> retval;
return retval;
}
int main() {
spam<std::vector, float> one;
// spam<std::vector, double> two = function(one);
auto two = function(one);
return 0;
}
这基本可行,但我想检查function()
返回的类型是否符合我期望的spam<std::vector, double>
,而不是接受auto
返回。非auto版本无法编译,因为
<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);
~~~~~~~~^~~~~
我有一个不匹配的问题,即
spam<std::vector, double>
和 spam<spam<std::vector, float>::template Temp, doulbe>
之间存在不匹配,尽管我期望 spam<std::vector, float>::template Temp
与 std::vector
相同。实际上,我可以检查到 std::is_same_v<spam<std::vector, float>::template Temp<int>, std::vector<int>>
确实为真——也就是说,在向 Temp
提供模板参数后,我得到了期望/所需的行为,只是我正在贡献代码的部分主要使用未解决的 CONTAINER
。问题: 有没有一种方法将
T::template Temp
规范化为任何类型并从类型中删除 spam<...>::Temp
?
T::template Temp
不是一个类型,与你最后一句话所说的相反。 - Max Langhof