当用作非类型模板参数时,是否可以自动派生std :: array的大小

时间:2018-05-04 00:14:14

标签: c++ arrays templates non-type

以下作品。但是,是否可以省略SIZE模板参数(即不一定是数组的SIZE模板参数)?

template <
    class T,
    size_t SIZE,
    std::array<T, SIZE> & ARR
>
class Foo{};

换句话说,编译器是否可以从数组模板参数中推导出SIZE?从而避免了这一行

const size_t SIZE,

2 个答案:

答案 0 :(得分:1)

使用C ++ 17,您可以使用自动模板参数:

template<auto&>
struct Foo {};

然后,您可以发送对全局的引用:

void test() {
    static auto arr = std::array{1, 2, 3, 4, 5}; // no linkage works in C++17
    Foo<arr> f{};
}

答案 1 :(得分:1)

你可以通过std::tuple_size(std::array)(自C ++ 11以来)在编译时获得大小,例如

template <
    class ARRAY
>
struct Foo{
    static constexpr size_t SIZE = std::tuple_size<ARRAY>::value;
    using T = typename ARRAY::value_type;
};

并将其用作

Foo<array<int, 3>> f;