首页 > 解决方案 > 提供多个值的 C++ 函数:引用参数还是元组?

问题描述

几十年来,我一直在通过参数列表制作提供多个值的函数:

void initialize (World& world, Monster& monster, Player& player)
{
   world.load("worldFile.txt");
   monster.load ("monsterFile.txt"); monster.setPos (100,0,0);
   player.setPos (0,0,0);
}

当然,C++17 提供了元组,但这看起来效率低下:

std::tuple<World, Monster, Player> initialize ()
{
   World world; Monster monster; Player player; //do loading etc.;
   return {world, monster, player};
}

但这应该没问题(我认为):

std::tuple<double, std::string> makeSomething ()
{
    return {5.0, "someString"s};
}

复制开销在什么时候变得足够高以至于使用引用参数比使用元组更明智?或者有没有办法使auto initialize版本高效?

标签: c++c++17

解决方案


您需要移动对象以避免复制:

std::tuple<World, Monster, Player> initialize ()
{
    // ...
    return {std::move(world), std::move(monster), std::move(player)};
}

类型必须是可移动的。如果不是,您仍然可以获得副本。


推荐阅读