按位置引用函数的参数?

时间:2009-08-31 17:38:14

标签: c++

我不确定我知道怎么问这个。

说我有一个功能

void myFunc ( int8 foo, float bar, int whatever )
{
...
}

是否可以通过其位置快速引用特定参数?

void myFunc ( float foo, float bar, float whatever )
{
   float f;
   f = ARG[1]; // f now equals bar
}
是什么意思?

跟进:

感谢您的回答。我想我错了。我发现奇怪的是c ++不允许这样做,因为perl和一些伪语言(我特别想到AutoIt)。至于“为什么”?只是使用一个简单的循环来完成它们。我认识到在正常情况下有很多更好的方法可以达到这个目的,但是我最不愿意在我的小世界之外修改任何人的代码。换句话说,我无法控制调用代码。它将输入推到我的喉咙,我必须尽可能地管理它们。所以我不能在调用我的函数之前循环。无论如何,它显然是一团糟,并没有那么多变量,所以我只是重复代码。没什么大不了的。感谢您的评论和有趣的建议。

6 个答案:

答案 0 :(得分:8)

您可能需要boost::tuple吗?

#include <boost/tuple/tuple.hpp>

void myFunc ( const boost::tuple<int, float, double>& t )
{
   float f;
   f = boost::get<1>(t); // f now equals bar
}

int main()
{
    myFunc( boost::make_tuple( 1, 2.0f, 3.0 ) );
}

它为您提供静态类型检查,您可以按位置获取元素。元组是未来标准的一部分。它可以在某些编译器中用作std::tr1::tuple

如果所有参数都是相同类型,则可以使用std::vector

#include <vector>

void myFunc ( const std::vector<float>& t )
{
   float f;
   f = t[1]; // f now equals bar
}

int main()
{
    std::vector<float> f_array;
    f_array.push_back( 1.0f );
    f_array.push_back( 2.0f );
    f_array.push_back( 3.0f );
    myFunc( f_array );
}

答案 1 :(得分:3)

不在C或C ++中,没有。

正如moonshadow所说:你想解决的实际问题是什么?

(如果您想添加解释,请编辑您的问题,而不是对此答案发表评论 - 更多人会看到您的编辑方式。)

答案 2 :(得分:2)

您可以使用C风格的变量参数:

#include <stdarg.h>

void myFunc (int8 foo, ...)
{
  va_list args;
  va_start(args, foo);

  float bar = va_arg(args, float);
  int whatever = va_arg(args, int);

  va_end(args);
}

但这意味着:

  1. 你需要提前知道 将用于调用的参数 功能。
  2. 你没有得到任何 静态类型检查的好处。

答案 3 :(得分:2)

如果您真正需要的是相同类型的值的参数数组而不是显式命名的参数,那么您只需将数组作为参数传递。

void myFunc ( float foo[3] )
{
    float bar;
    bar = foo[1];
}

如果你的数组更长,这可能是低效的,所以更好的解决方案是使用这样的const引用:

void myFunc ( const float & foo[3] )
{
    float bar;
    bar = foo[1];
}

或者像这个网站上的许多c ++问题一样,最好的解决方案是使用std :: vector

void myFunc ( const std::vector<float> & foo )
{
    float bar;
    bar = foo[1];
}

答案 4 :(得分:1)

没有符合标准的方法可以做到这一点。

答案 5 :(得分:1)

尝试<cstdarg>标题。

请记住,您不会获得对参数的索引访问权限,但您可以编写循环并调用va_arg,直到找到所需的参数。弄清楚参数的数据类型将是你的下一个问题。