【问题标题】:How to use std::allocator_traits::construct to create struct object from function parameters?如何使用 std::allocator_traits::construct 从函数参数创建结构对象?
【发布时间】:2019-08-12 12:14:26
【问题描述】:

我有一个结构定义为:

struct Foo
{
    double x;
    double y;
};

我有一个将此结构作为参数的函数:

void doSomethingWithFoo(Foo foo);

我也想通过直接传递结构成员来使用这个函数:

void doSomethingWithFoo(double x, double y);

有没有一种方法可以使用std::allocator_traits::construct 或任何其他方法来实现,而无需明确定义第二个函数?

【问题讨论】:

  • 不清楚你为什么认为你需要std::allocator_traits。问题真的只是:“如何将void doSomethingWithFoo(Foo foo); 称为doSomethingWithFoo(x,y);”,对吗?
  • vector::emplace 的文档提到“通过调用 allocator_traits::construct 并转发参数来就地构造元素。”
  • ..但是你的代码中没有向量
  • std::vector::emplace 的文档为想要提供自己的分配器的人提到了这一点。但是分配器并不是专门用于从参数构造对象,而是用于管理内存分配(顾名思义)。如果您不想控制内存分配,则不需要分配器。基本上,std::vector::emplace 涉及做 X 和 Y,文档中提到了 Y(所以您询问 Y),但您真正想要/需要的方面是 X。另请参阅 XY problem
  • 您能否详细说明您的真正问题涉及什么?你有很多不同的类(你只展示一个),这应该适用吗?还是Foo 有很多构造函数?如果两者都不是,你希望通过这样做而不是仅仅打电话给doSomethingWithFoo({x, y});获得什么?

标签: c++ function struct arguments parameter-passing


【解决方案1】:

您可以直接执行此操作:doSomethingWithFoo({ 1, 2 });。编译器知道doSomethingWithFoo 采用Foo 类型,因此它会查找从您给它的(int, int) 到Foo 的转换。作为一个简单的“plain old data”(POD)类型,初始化列表中的构造函数是隐式的,并且可以正常工作。

struct Foo
{
    double x;
    double y;
};

void doSomethingWithFoo(Foo foo)
{
    std::cout << foo.x << ", " << foo.y << std::endl;
}

int main()
{
    doSomethingWithFoo({ 1, 2 });

    return 0;
}

打印:

1, 2

【讨论】:

    【解决方案2】:

    考虑到Foo 是一个简单的POD 类型,您可以将它的实例创建为Foo{x, y}

    然后你可以做一个调用第一个版本的函数的重载:

    inline void doSomethingWithFoo(double x, double y)
    {
        doSomethingWithFoo(Foo{x, y});
    }
    

    【讨论】:

    • 是的,这就是我目前所做的。我想知道是否有办法不显式重载函数。 vector::emplace 的文档提到“该元素是通过调用 allocator_traits::construct 并转发 args 就地构造的”。我想知道是否可以以某种方式使用它来避免重载定义
    • @locke14 为此使用分配器只是矫枉过正。它可以完成,但需要更多的工作和更多的代码。您想使用分配器是否有特定原因?
    • doSomethingWithFoo({x, y}) 在我的情况下应该工作得很好
    猜你喜欢
    • 1970-01-01
    • 2020-03-18
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多