传入一个向量作为具有设定值的参数

Passing in a vector as a parameter with set values

概览:

我正在用 C++ 制作视频游戏,我需要有一个敌人可以掉落的物品列表,以及每个物品的掉落几率,但不同的敌人可能有不同数量的物品可以掉落降低。 我有一个 ActorDefinition class,其构造函数定义了关于敌人的所有统计数据和事物。

问题来了:

如何将向量传递给具有任意定义值的对象构造函数?

例如,这是我希望能够像使用静态数组一样执行的操作:

//first array is item types to drop, second array is drop chances as percentages
ActorDefinition("actorname", [10, 2], [50, 90]);

这个不错,而且只占一行。但是我不能这样做,因为我需要动态大小,因此我想使用矢量。

所以我基本上需要这样做,(它可以实现我想要的,但非常混乱):

vector<int> drops;
drops.push_back(10);
drops.push_back(2);
vector<int> dropChances;
dropChances.push_back(50);
dropChances.push_back(90);
ActorDefinition("actorname", drops, dropChances); 

有没有一种方法可以做到这一点而无需像上面那样添加单独的代码行? (我有如此多的演员定义和如此多的项目,如果我要为每个人都这样做,它会堆积成吨的烦人代码行)创建一个向量并用我的值推回每个索引?

编辑 - 修复了我的示例代码中的拼写错误

像这样定义你的函数:

void ActorDefinition(
    const std::string& actorname,
    const vector<int>& drops,
    const vector<int>& dropChances); 

使用 C++11 的 direct list initialization 语法你可以这样写:

vector<int> drops{10,2};
vector<int> dropChances{50,90};
ActorDefinition("actorname", drops, dropChances);

或者更简洁,但不一定更具可读性:

ActorDefinition("actorname", vector<int>{10,2}, vector<int>{50, 90});

最后,如果您的函数重载可以明确解决,您甚至可以使用 copy list initialization 并像这样调用它:

ActorDefinition("actorname", {10,2}, {50, 90});

不过要小心使用这个最终形式。例如,这有效:

void func(vector<int> a);
func({1,2});

但是添加另一个 func 重载会中断 func({1,2}) 调用:

void func(vector<int> a);
void func(set<int> a);
func({1,2});//ERROR! Call to func is ambiguous!

(请注意,当您将 5090 添加到 drops 时,上述所有示例还修复了代码中重复的 push_back 中的拼写错误dropChances:))

您可以像这样定义函数:

typedef vector<int> vi; // handy while declaring a lot of them

int ActorDefinition(string name, vi vec1, vi vec2)
{
    // body here
}

也可以这样调用:

ActorDefinition("someName", {10, 20}, {30, 50, 60, 70});
template <typename T>
class make_vector {
public:
  typedef make_vector<T> my_type;
  my_type& operator<< (const T& val) {
    data_.push_back(val);
    return *this;
  }
  operator std::vector<T>() const {
    return data_;
  }
private:
  std::vector<T> data_;
};

所以你可以使用这个函数构造向量:

std::vector<int> v = make_vector<int>() << 50 << 90;

所以在你的情况下:

ActorDefinition("name", make_vector<int>() << 50 << 90, make_vector<int>() << 10 << 20);

在 C++11 中,您可以简单地使用:

std::vector<int> v { 34,23 };
ActorDefinition("name", {10, 20}, {30, 50});