C++ 如何在C++;模板元编程?

C++ 如何在C++;模板元编程?,c++,types,metaprogramming,template-meta-programming,C++,Types,Metaprogramming,Template Meta Programming,我有一个简单的模板元程序,可以将许多std::ratios转换为尽可能少的ratios。如果没有溢出(并且它是这样做的),它必须返回1ratio,如果有溢出,它必须返回2或更多。有可能实现吗 template<class R, class ...Rs> struct unite_ratio; template<intmax_t Num, intmax_t Den> struct unite_ratio<std::ratio<Num, Den>>

我有一个简单的模板元程序,可以将许多
std::ratio
s转换为尽可能少的
ratio
s。如果没有溢出(并且它是这样做的),它必须返回1
ratio
,如果有溢出,它必须返回2或更多。有可能实现吗

template<class R, class ...Rs> struct unite_ratio;

template<intmax_t Num, intmax_t Den> 
struct unite_ratio<std::ratio<Num, Den>>
{
    using type = std::ratio<Num, Den>;
};

template<
    intmax_t Num1, intmax_t Den1, 
    intmax_t Num2, intmax_t Den2,
    class ...Rs
> struct unite_ratio<std::ratio<Num1, Den1>, std::ratio<Num2, Den2>, Rs...>
{
    // here might be an overflow
    static constexpr intmax_t num = 
        std::__static_sign<Den1>::value * std::__static_sign<Den2>::value *
        (Num1 / std::__static_gcd<Num1, Den2>::value) * 
        (Num2 / std::__static_gcd<Num2, Den1>::value);

    // Here might be an overflow as well
    static constexpr intmax_t den =
        (std::__static_abs<Den1>::value / std::__static_gcd<Num2, Den1>::value) *
        (std::__static_abs<Den2>::value / std::__static_gcd<Num1, Den2>::value);

    // returns only one type
    using type = unite_ratio<std::ratio<num, den>, Rs...>;
};
template-struct-unite\u比率;
模板
结构单位比
{
使用类型=标准::比率;
};
模板<
intmax\u t Num1,intmax\u t Den1,
intmax\u t Num2,intmax\u t Den2,
类…Rs
>结构单位比
{
//这里可能有溢出
静态constexpr intmax\u t num=
标准::静态符号::值*标准::静态符号::值*
(Num1/std::uuu static_ugcd::value)*
(Num2/std:uuu静态u gcd::值);
//这里可能也有溢出
静态constexpr intmax\t den=
(标准::_static_abs::value/标准::_static_gcd::value)*
(标准::uu static_abs::value/标准::u static_gcd::value);
//仅返回一种类型
使用类型=单位/单位比率;
};
如何在C++模板元程序设计中返回多个类型?

使用类型列表。它只是一个模板类,其模板参数的可变列表是类型列表:

template<class...T>
struct types{};
模板
结构类型{};

听起来像是
std::vector
的工作。std::vector的类型?你想要的任何类型,但肯定是那种类型。这是指联合收割机中的“联合”还是“单位”?联合收割机中的“联合”吗