Примените одну и ту же функцию к каждому элементу из N массивов разных размеров [закрыто]

Столкнулся с той же проблемой, использовал этот

Console.log (Date.parse («13 июня 2018 10:50:39 GMT + 1»));

Он вернет миллисекунды, к которым вы можете проверить, есть +100 timzone intialize британское время Надеюсь, что это поможет !!

1
задан Pippin 24 February 2019 в 16:42
поделиться

3 ответа

Скорее всего, вы захотите упаковать код в определенную функцию инициализации. Поскольку (std::) массивы различной длины на самом деле являются разными типами, тем не менее, вам либо нужна функция шаблона, либо вам нужно работать с внутренними необработанными массивами (data()):

template <typename T>
void initialize(T& t)
{
    for(auto& a : t)
    //      ^ reference to pointer (!)
    {
        a = new A();
        a->foo();
    }
    std::cout << std::endl;
}

Затем просто вызовите эту функцию для каждого массива. Если это все еще не достаточно коротко, вы можете упаковать это в шаблонную функцию:

template <typename T, typename ... TT>
void initialize(T& t, TT& ... tt)
{
    initialize(t);
    initialize(tt...);
}

// alternatively, a bit shorter, with C++17 fold expression:
template <typename ... TT>
void initialize(TT& ... tt)
{
    (initialize(tt), ...);
}

В точке вызова это, скорее всего, будет самое короткое время, которое вы можете получить (кроме выбора еще более короткого имени ):

initialize(array1, array2, array3, array4, ...);
0
ответ дан Aconcagua 24 February 2019 в 16:42
поделиться

Вы можете сделать что-то вроде:

template <std::size_t N>
using As = std::array<A*, N>;

std::tuple<As<size1>, As<size2>, As<size3>, As<size4>, As<size5>,
           As<size6>, As<size7>, As<size8>, As<size9>> arrays;

std::apply([](auto& ...as)
          {
              auto l = [](auto& a)
              {
                for (auto& element : a)
                {
                    element = new A();
                    element->foo();
                }
              };
              (l(as), ...);
          }, arrays);

Или даже проще:

template <size_t N>
std::array<A*, N> MakeAs()
{
    std::array<A*, N> res;
    for (auto& element : res)
    {
        element = new A();
        element->foo();
    }
    return res;
}

и

auto array1 = MakeAs<size1>();
auto array2 = MakeAs<size2>();
auto array3 = MakeAs<size3>();
auto array4 = MakeAs<size4>();
auto array5 = MakeAs<size5>();
auto array6 = MakeAs<size6>();
auto array7 = MakeAs<size7>();
auto array8 = MakeAs<size8>();
auto array9 = MakeAs<size9>();
0
ответ дан Jarod42 24 February 2019 в 16:42
поделиться
//C++ 11 SFINAE fold
template<size_t I = 0, typename F, typename ...Ts>
typename std::enable_if<I == sizeof...(Ts)>::type       //I == end
    for_each(std::tuple<Ts...>&, const F&) {}


template<size_t I = 0, typename F, typename ...Ts>
typename std::enable_if<I < sizeof...(Ts)>::type        //I < end
    for_each(std::tuple<Ts...>& tuple, const F& function)
{
    function(std::get<I>(tuple));
    for_each<I + 1>(tuple, function);
}

//C++ 17
template<size_t I = 0, typename F, typename ...Ts>
void for_each(std::tuple<Ts...>& tuple, const F& function)
{
    if constexpr(I < sizeof...(Ts))
    {
        function(std::get<I>(tuple));
        for_each<I + 1>(tuple, function);
    }
}

//Client
for_each(std::tie(array1, array2, array3, array4, array5, array6, array7, array8, array9), 
    [](auto& array)
    { 
        for(auto* element : array)
        {
           element = new A();
           element->foo();
        }
    });
0
ответ дан Andreas Loanjoe 24 February 2019 в 16:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: