【问题标题】:std::apply to constructor in a templated function [duplicate]std::apply 应用于模板函数中的构造函数[重复]
【发布时间】:2019-07-04 16:37:39
【问题描述】:

我正在编写泛型代码,我需要使用泛型可变参数元组调用泛型模板参数T 的构造函数:

T& init_and_return(ArgsTuple& args)
{
    m_data = std::apply(&T::T, args); // here compiler complains
    return m_data;
}

在我的主要类型中,T 将是一个名为 A 的类型。 编译器说“A 中没有名为 T 的成员”。

怎样才能泛型引用T的构造函数?

【问题讨论】:

  • 无论类型是否为模板参数,都无法获得指向构造函数的指针。
  • @interjay 使用 std::apply 和构造函数的任何解决方法?
  • 这里是如何从 args 元组stackoverflow.com/questions/14897527/…构造一个对象
  • @Renat 没有更可读的方式在 C++17 中实现相同的目标?
  • std::apply([](auto&&... args2) { return T{std::forward<decltype(args2)>(args2)...}; }, args); 就足够了,但 Yakk 的回答更好。

标签: c++ templates tuples


【解决方案1】:

构造函数不像其他方法那样是函数或方法——它是特殊的,你不能获取它的地址。我个人认为应该可以,但事实并非如此。

C++ 标准有make from tuple,可以满足您的需求。

m_data = std::make_from_tuple<T>(args);

【讨论】:

  • 你能解释一下构造函数不是函数或方法吗?
  • [class.mem.special] 声明“默认构造函数、复制构造函数、移动构造函数、复制赋值运算符、移动赋值运算符和析构函数是特殊成员函数。” 。这和你说的有点矛盾,不是吗?
  • @Fureeish 当然,这在技术上是正确的,这是最好的正确方法。
猜你喜欢
  • 1970-01-01
  • 2013-05-30
  • 2020-01-14
  • 2011-12-01
  • 2011-05-24
  • 2015-09-30
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多