如何将std :: tuple乘以某个值?

时间:2018-06-01 08:10:39

标签: c++

我创建了下一个元组

std::tuple<double, double, double> m_size = std::make_tuple(1.0, 1.0, 1.0);

我需要将元组的每个元素乘以一个coeff等于2.0并得到像

这样的结果
(2.0,2.0,2.0)

我可以这样做

   std::get<0>(m_size) *= 2.0;
   std::get<1>(m_size) *= 2.0;
   std::get<2>(m_size) *= 2.0;


还有哪些其他选择可以做同样的事情?

2 个答案:

答案 0 :(得分:2)

你将不得不将每个元素相乘,但是像这样的东西将减少std :: get手动和乘法每个元素的需要,并为编译器提供一个很好的优化机会。

#include <iostream>
#include <type_traits>
#include <tuple>
#include <iomanip>

template <typename T,typename Tuple, size_t... Is>
void multiply_tuple_elements(T coeff, Tuple& tuple,std::index_sequence<Is...>)
{
    using do_= int[];
    (void)do_{0, ( 
            std::get<Is>(tuple)*=coeff
    ,0)...}; 
}

int main()
{
    double coeff = 2.0;
    std::tuple<double, double, double> m_size = std::make_tuple(1.0, 1.0, 1.0);
    multiply_tuple_elements(
            coeff,
            m_size ,
            std::make_index_sequence<std::tuple_size<decltype(m_size)>::value>()
    );

    std::cout << std::fixed;
    std::cout << std::get<0>(m_size) << std::endl;
    std::cout << std::get<1>(m_size) << std::endl;
    std::cout << std::get<2>(m_size) << std::endl;

    return 0;
}

Demo

答案 1 :(得分:0)

  

如何更有效地完成这项工作?

在执行性能方面:你不能......每次乘法都会涉及CPU的FPU,每次乘法都需要单独完成那里

如果你想获得更简单的代码(一旦编译,仍然分别进行乘法运算......),你可能会尝试为元组实现某种for_each,可能基于此{{3}这样你就可以像这样写一个单行:

foreach(m_size, [](double& v) { v *= 2; });

不确定这是否符合 效率的定义,但是......

由于类型完全相同,您可以切换到std::array<double, 3>,然后使用标准库std::for_each。通过提供基于范围的包装器(遗憾的是尚未存在于标准库中),甚至可以进一步简化这一过程:

template <typename C, typename F>
void for_each(C& c, F&& f)
{
    std::for_each(c.begin(), c.end(), std::move(f));
}