Может ли размер std :: array быть автоматически получен при использовании в качестве нетипичного параметра шаблона - PullRequest
0 голосов
/ 04 мая 2018

Следующие работы. Однако возможно ли пропустить параметр шаблона SIZE (т. Е. Необязательно аргумент шаблона SIZE для массива)?

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

Другими словами, возможно ли, чтобы компилятор выводил SIZE из аргумента шаблона массива? Таким образом, удаляя линию

const size_t SIZE,

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вы можете получить размер во время компиляции через 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;
0 голосов
/ 04 мая 2018

Используя 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{};
}
...