递归可变参数 C++ 模板

问题描述 投票:0回答:1

那么,

我有以下模板,可以将两个单位相乘,例如速度和时间。

    //! The product of the TWO units
    template<template<typename> typename QuantityLhs, template<typename> typename QuantityRhs>
    struct Multiply
    {
        template<typename T>
        using type = units::unit<typename product_t<QuantityLhs<UNIT_LIB_DEFAULT_TYPE>, QuantityRhs<UNIT_LIB_DEFAULT_TYPE>>::conversion_factor, T>;
    };

例如,可以通过以下方式调用:

using AccuType = Multiply<Velocity, Time>::type<float>;

问题

上面的定义只接受两个模板参数,但我想要任意数量的模板参数。

所以我希望能够写出类似的东西

using AccuType = Multiply<Velocity, Time, Temperature, Density>::type<float>;

所以我的想法是创建一个可变参数模板

    //! The product of the ANY number of units
    template<typename... Quantities>
    struct MultiplyMany
    {
        // Code
    };

不幸的是,我不知道如何让它发挥作用。我有这样的想法,

MultiplyMany
会以某种方式使用 for 循环或其他东西来根据需要多次调用基本
Multiply
结构(迭代模板参数)。

这可能吗?

c++ templates variadic-templates
1个回答
0
投票

您可以将

Quantity
转为可变参数模板

template<template<typename> typename... Quantities>
struct Multiply
{
    template<typename T>
    using type = units::unit<
      typename product_t<Quantities<UNIT_LIB_DEFAULT_TYPE>...>::conversion_factor, T>;
};

using AccuType = Multiply<Velocity, Time, Temperature, Density>::type<float>;
© www.soinside.com 2019 - 2024. All rights reserved.