“衰减”模板别名

时间:2019-05-06 16:40:00

标签: c++ c++17 template-deduction template-templates

这是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 Tempstd::vector之间不匹配。 (实际上,我可以检查std::is_same_v<spam<std::vector, float>::template Temp<int>, std::vector<int>>的确是正确的-也就是说,在为Temp提供模板参数后,我已经期望/期望的行为,只是我贡献的代码大多与未解决的{ {1}}。

问题:是否有一种方法可以将CONTAINER标准化为任何东西并从类型中删除T::template Temp

1 个答案:

答案 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 {}; }