首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何通过构造函数而不是函数来使用boost::hana::unpack?

如何通过构造函数而不是函数来使用boost::hana::unpack?
EN

Stack Overflow用户
提问于 2018-07-24 01:58:06
回答 2查看 406关注 0票数 2

在此示例代码中,如何使用pars调用构造函数来创建Foo2D对象?

代码语言:javascript
复制
#include <boost/hana/tuple.hpp>
#include <boost/hana/unpack.hpp>

class Foo2D {
public:
    Foo2D(int x, int y):m_x(x), m_y(y) {}
private:
    int m_x;
    int m_y;
};

int main() {
    auto pars = boost::hana::make_tuple(10, 20);
    Foo2D foo1(10, 20); //my intention
    Foo2D foo2 = boost::hana::unpack(pars, Foo2D); //fails
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-24 02:39:19

构造函数不是函数也不是函数式。您可以使用lambda或常规函数:

代码语言:javascript
复制
boost::hana::unpack(pars,
                    [](auto&&... args) {
                        return Foo2D(std::forward<decltype(args)>(args)...);
                    });
票数 4
EN

Stack Overflow用户

发布于 2018-07-24 04:50:19

代码语言:javascript
复制
template<class T>
constexpr auto ctor = [](auto&&...args)
  noexcept(noexcept(T{ decltype(args)(args)... }))
  -> decltype( T{ decltype(args)(args)... } )
  {
    return T{ decltype(args)(args)... };
  };

现在:

代码语言:javascript
复制
Foo2D foo2 = boost::hana::unpack(pars, ctor<Foo2D>);

应该行得通。

或者:

代码语言:javascript
复制
// Object that represents constructing an object of type T:
template<class T>
struct ctor_t {
  template<class...Args>
  constexpr auto operator()(Args&&...args) const
  // propogate noexcept:
  noexcept(noexcept(T{ std::forward<Args>(args)... }))
  // SFINAE friendly:
  -> decltype( T{ std::forward<Args>(args)... } )
  {
    // notice this expression is repeated twice above:
    return T{ std::forward<Args>(args)... };
  }
  template<class A0, class...Args>
  constexpr auto operator()(std::initializer_list<A0> il, Args&&...args) const
  noexcept(noexcept( T{ il, std::forward<Args>(args)... } ))
  -> decltype(T{ il, std::forward<Args>(args)... })
  {
    return T{ il, std::forward<Args>(args)... };
  }
  constexpr ctor_t() {} // some compilers require this

  template<class...Args>
  constexpr (*operator T() const)(Args...) const {
    return +[](Args...args)->T {
      return ctor_t<T>{}(std::forward<Args>(args)...);
    };
  }
  explicit operator bool() const = delete;
};
template<class T>
constexpr ctor_t<T> ctor{};

如果你害怕lambda版本。此版本还支持前导初始化器列表和固定签名的隐式强制转换到工厂函数指针。

Live example。测试代码:

代码语言:javascript
复制
// construct an int 7:
auto x = ctor<int>( 7 );
std::cout << x << "\n";

// get a pointer to a constructor function
// that constructs an int from a short:
int(* pf)(short) = ctor<int>;
// run it:
std::cout << pf(0) << "\n";
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51484735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档