首页 > 解决方案 > 一组值的零开销下标运算符

问题描述

假设我们有一个具有以下签名的函数(签名可能不会更改,因为此函数是遗留 API 的一部分):

void Foo(const std::string& s, float v0, float v1, float v2)
{ ... }

如何在[]不将数据实际复制到某种容器中的情况下,使用下标运算符通过索引访问最后三个参数?

通常,当我遇到此类问题时,我会将值放入容器中,例如const std::array<float,3> args{v0,v1,v2};并使用 访问这些值args[0],不幸的是,这需要复制这些值。

另一个想法是使用参数包访问参数,这反过来又涉及创建一个模板化函数,这对于这个任务来说似乎是多余的。

我知道使用的版本std::array<>可能是合适的,因为编译器可能会优化这类东西,但是,这个问题有点学术动机。

标签: c++

解决方案


另一个想法是使用参数包访问参数,这反过来又涉及创建一个模板化函数,这对于这个任务来说似乎是多余的。

不必要。您可以做的一件事是使用std::tie构建std::tuple对函数参数的引用,然后通过std::get. 这应该优化出来,但让您引用参数,就好像它们是单个集合的一部分一样。那看起来像

void Foo(const std::string& s, float v0, float v1, float v2)
{
    auto args = std::tie(v0, v1, v2);
    std::cout << std::get<1>(args);
}

它不使用operator [],并且要求您的索引是编译时常量,但您现在可以将它们作为一个对象传递给其他东西。


推荐阅读