首页 > 解决方案 > 构造模板化元组类型

问题描述

我正在尝试编写这样的函数

template<
        bool b, RT = std::conditional_t<b,
               std::tuple<int, int, int, int>,
               std::tuple<int, int, int, int, double, double, double, double>
        >
RT function()
{
    int i1, i2, i3, i4;

    if constexpr(b)
    {
        double i5, i6, i7, i8;
        return { i1, i2, i3, i4, i5, i6, i7, i8 };
    }
    else
    {
        return { i1, i2, i3, i4 };
    }
}

有没有办法为元组创建一个模板化的 typedef 以便我可以简化上述函数

template<typename T, int N>
using tuple_t = std::tuple<T, T, ... N1 times>

template<typename T1, int N1, typename T2, int N2>
using tuple_t = std::tuple<T1, T1, ... N1 times, T2, T2, ... N2 times>

标签: c++templatestuplesvariadic-templatestemplate-meta-programming

解决方案


您可以使用返回类型推导并将聚合初始化替换为调用make_tuple

template<bool b>
auto function()
{
    int i1, i2, i3, i4;

    if constexpr(b)
    {
        double i5, i6, i7, i8;
        return std::make_tuple(i1, i2, i3, i4, i5, i6, i7, i8);
    }
    else
    {
        return std::make_tuple(i1, i2, i3, i4);
    }
}

如果您仍然需要返回类型,您可以简单地创建一个特征:

template <bool b>
using return_t = decltype(function<b>());

推荐阅读