将对象作为参数传递给C ++中的函数

时间:2012-02-06 01:57:05

标签: c++

在Javascript或ActionScript中,可以将对象传递给函数或构造函数。

myfunction({myParam:1, myOtherParam:"hello"});

当你需要传递很多参数时它非常有用,IMO使用函数比使用经典方法更容易。

myFunction(1,"hello");

C ++中有类似内容吗?

TIA

8 个答案:

答案 0 :(得分:4)

提升参数http://www.boost.org/doc/libs/release/libs/parameter/完全符合您的要求。

摘自:

  

使用此库编写可以执行的函数和类模板   按名称接受参数

小例子:

// include boost parameter
#include <boost/parameter/keyword.hpp>
namespace parameter = boost::parameter;

// first declare named parameters
BOOST_PARAMETER_NAME(a)      // Note: no semicolon
BOOST_PARAMETER_NAME(b)

// then declare your function
BOOST_PARAMETER_FUNCTION(
      (int),                 // 1. parenthesized return type
      my_function,           // 2. name of the function
      tag,                   // 3. namespace of tag types (don't change!)
      (required (a, int) )   // 4. one required parameter of type int
      (optional              //    and an optional parameters, with default value
        (b, int, 0)
      )
)
{
  return a + b;
}

// then you can call it with no named parameters
int result = my_function(1, 2);

// or with named parameters
int result = my_function(_a=1, _b=2);

// also with optional parameters omitted
int result = my_function(_a=3);

答案 1 :(得分:1)

您可以使用“命名参数idiom”: http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.20

这会使您的通话看起来像:

f(1).myOtherParam("Hello")

有关与Boost参数的比较,请参阅here

答案 2 :(得分:0)

一个可以使用结构:

struct foo {
   int a,b,c;
   float f;
}

可悲的是,你需要在某处定义它们,接收功能需要接受它们,你不能只是在原地制作它们。

在一天结束时, C ++中没有可以模仿JavaScript'成语'的语言工具。这些东西在于动态语言的本质,而C ++则不然。

答案 3 :(得分:0)

在C ++中,对象是类的实例。您可以创建一个包含所有可能参数的类,实例化它并用特定值填充它,然后将该实例传递给函数。

你不能只传递一个任意对象而不是函数的参数,因为C ++没有命名参数 - 只有位置很重要,并且某种哈希结构中的位置会丢失。因此,当您拥有函数foo(y=3)时,您无法说foo(int x, int y)因为名称xy仅在函数内有意义 - 而不是其调用者。

答案 4 :(得分:0)

不,不是真的。标准库中有一个map类,当然你可以编写一个函数来接受map个完整的命名值作为输入,但没有任何东西直接作为语言特性存在于等同于什么你已经表现出来了。

正如其他几个海报所指出的,当然你可以定义一个类来保存所有的数据值,但这只是将有序的参数列表从函数推送到该对象的构造函数,所以它根本没有给你买任何东西

答案 5 :(得分:0)

使用结构或类对数据进行分组。

如果您正在寻找传递键值对的方法,请使用STL maps

答案 6 :(得分:0)

不是语言水平,但是:

当您要传递大量参数时非常有用,IMO使用函数比使用经典方法更容易。

如果可以的话,你应该考虑减少你的参数。通常可以通过使用聚合来实现:

Example: 
    draw_rectangle(x1, y1, x2, y2, r, g, b, a)
Could be reduced to:
    draw_rectangle(p1, p2, color)
Or even further:
    draw_rectangle(rect, color)

如果你这样做,应该大大减轻命名参数的诱惑。

您还可以使用其他方法,例如Boost参数,通过大量的模板魔术,可以完成类似的操作。但是,它要求您使用这种技术将所有功能转换为以非常精确的方式编写的模板,并且这是一种非常笨重且严厉的尝试,迫使语言执行某些事情,如果您问我不应该做的事情。

答案 7 :(得分:0)

您可以执行以下操作,它支持有限数量的默认值(受C ++模板系统限制)。您需要使用最新标准(C ++ 11)

进行编译
// used to skip arguments and default to the previously specified value
struct UseDefault {
  // empty intentionally!
};

// using this is optional, and only required if you want to provide default values by the CALLED function
template <typename T, T def> struct Default {
  T value;
  operator T() {
    return value;
  }
  Default(T value) : value(value) {}
  Default(UseDefault ignore) : value(def) {(void)ignore;}
};

// using tuple, you can bundle any number of parameters to one
int myFunc(std::tuple<Default<int,7>,Default<char,'x'>,std::string> parameters) {
  std::cout << std::get<0>(parameters) << ", " << std::get<1>(parameters) << std::endl;
  return 0;
}

然后您可以像这样调用myFunc

func(std::make_tuple(6,UseDefault(),"hi"));

但请注意,模板参数类型存在一些限制,例如,您无法将字符串(或char* s)作为模板参数传递。但是,如果您只需要合理的基本默认值,则可以使用。

当然,如果您删除了指定默认值的要求,则只需使用std::tuple而不使用Default类型。