Создание кортежа с помощью allocator c ++ - PullRequest
0 голосов
/ 20 марта 2019

Я использую кортежи в C ++, и сейчас я пытаюсь создать кортеж с помощью allocator из libcxx

template <class _Alloc>
LIBCPP_INLINE_VISIBILITY
tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t)

например:

std::allocator<int> myAllocator;
std::tuple<int> t(std::allocator_arg, myAllocator, 2);

но кажется строка выше называется

template <class Alloc>
tuple(allocator_arg_t, const Alloc& a, const Types&...);

что мне поменять для этого?

Также есть одна строка, которая мне не понятна:

 explicit
 tuple(_Up&&... __u)

как это называется?

1 Ответ

0 голосов
/ 20 марта 2019

Когда вы заглядываете в исходный код вашей реализации и видите

namespace std {

    // Other things

    template <typename ... _Tp>
    class tuple {

        // More things

        template <class _Alloc>
        LIBCPP_INLINE_VISIBILITY
        tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t)
        // an implementation of this constructor

    };
}

Это является конструктором, который cppreference names

template <class Alloc>
tuple(allocator_arg_t, const Alloc& a, const Types&...);

YourРеализация выбрала использовать имена, которые зарезервированы для его использования.Что именно эти имена не имеют значения для компилятора.

что такое const _Tp& ... __t?

Это пакет параметров для копирования в кортеж.Для std::tuple<int> это const int&, для std::tuple<std::string, bool, char> это const std::string &, const bool &, const char &.__t - это имя пакета параметров.C ++ позволяет шаблонам иметь разное количество параметров.

как насчет tuple(_Up&&... __u)?

Это перегрузка (3)

Конвертирующий конструктор,Инициализирует каждый элемент кортежа с соответствующим значением в std::forward<UTypes>(args).

Эта перегрузка участвует только в разрешении перегрузки, если sizeof...(Types) == sizeof...(UTypes) и sizeof...(Types) >= 1 и std::is_constructible<Ti, Ui&&>::value равны true для всех i.

Конструктор является явным тогда и только тогда, когда std::is_convertible<Ui&&, Ti>::value равен false хотя бы для одного i.

Например, для std::tuple<int> tup('a');, tup будет инициализировансопоставив UTypes... с char, и первый член получит числовое значение 'a' (97 на большинстве платформ).

Обратите внимание, что нет смысла использовать конструктор с поддержкой распределителя для std::tuple<int>, потому что int не относится к типу с распределителем.Эти конструкторы существуют для таких случаев, как

using statefully_allocated = std::vector<int, my_stateful_allocator<int>>;
my_stateful_allocator<int> alloc1 = /* something */
statefully_allocated source(alloc);
my_stateful_allocator<int> alloc2 = /* something else */
std::tuple<statefully_allocated, char> tup(std::allocator_arg, alloc2, source, 'a');

, где член statefully_allocated копирует содержимое source, но использует для выделения копию alloc2.char член - просто обычный char, alloc2 не играет никакой роли в его конструкции.См. Конструкция использования-распределителя

...