这是this question的后续行动。
我的模板类型带有模板模板参数
template <template <typename...> class CONTAINER, typename NUMBERTYPE>
struct spam {
template <class T>
using Temp = CONTAINER<T>;
};
我想编写一个(模板化的)函数,该函数接受一个spam
实例,并返回一个稍有不同的类型的spam
实例。我想从输入中维护CONTAINER
模板参数,仅指定NUMBERTYPE
。 (godbolt link)
#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
是否返回我期望的类型。非自动版本无法编译,因为
<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
提供模板参数后,我已经期望/期望的行为,只是我贡献的代码大多与未解决的{ {1}}。
问题:是否有一种方法可以将CONTAINER
标准化为任何东西并从类型中删除T::template Temp
?
答案 0 :(得分:4)
问题:有没有一种方法可以将T :: template Temp规范化为任意值并从类型中删除垃圾邮件<...> :: Temp?
不,据我所知。
但是在这种情况下不是必需的,因为您可以重写[{'first_name': 'Nancy'}, {'first_name': 'Nancy'}]
[{'first_name': 'Tom'}, {'first_name': 'Nancy'}]
[{'first_name': 'Tom'}, {'first_name': 'Nancy'}]
来拦截模板模板参数function()
。
我的意思是:您可以按以下方式重写CONTAINER
function()
以下是完整的编译示例
template <template <typename...> class C, typename N>
spam<C, double> function (spam<C, N> const &)
{ return {}; }