模板函数重载(泛型类型与模板模板类型)选择正确的重载

时间:2017-08-07 14:44:16

标签: c++ templates overloading

我有一个模板函数,只要模板类型是数字,就可以执行给定值的操作:

0.75

此模板的重载需要包含数字的容器:

template <typename scalar_t>
void function(scalar_t value)
{
    if constexpr (std::is_floating_point_v<scalar_t>)
    {
        std::cout << value << 'F';
    }
    if constexpr (std::is_integral_v<scalar_t>)
    {
        std::cout << value;
    }
}

使用上面的模板,我调用以下代码:

template <typename scalar_t, template <typename> class container_t>
void function(const container_t<scalar_t> &container)
{
    for (const auto &value : container)
    {
        function(value);
        std::cout << ' ';
    }
}

其中给出了以下输出:

int main()
{
    function('0');
    function(short{1});
    function(2);
    function(3l);
    function(4ll);
    function(5.f);
    function(6.);

    std::vector<int> v{7, 8, 9, 10};
    std::list<double> l{11., 12., 13., 14.};

    function(v);
    function(l);

    return 0;
}

虽然我期待以下输出:

012345F6F

这意味着已选择第一个模板版本(012345F6F7 8 9 10 11F 12F 13F 14F )而不是第二个版本(function(scalar_t value))。

如何强制为模板模板参数选择第二版模板函数?

1 个答案:

答案 0 :(得分:2)

此处的问题是您的模板类型不匹配。 std::listtemplate <typename> class container_t都有分配器的模板参数。 void function(scalar_t value)不允许这样,因此模板不匹配,因此调用template <typename scalar_t, template <typename...> class container_t> void function(const container_t<scalar_t> &container) { for (const auto &value : container) { function(value); std::cout << ' '; } } 并且没有任何反应。

您需要做的是采用可变参数模板模板参数。使用

012345F6F7 8 9 10 11F 12F 13F 14F 

你得到了

docker run -d -p 127.0.0.1:22:22 -p 127.0.0.1:8000:8000 you_contaner_image_name

Live Example