0

我有一boost::variant组具有本质不同的非默认构造函数原型的非默认可构造(甚至可能是不可移动/不可复制和不可复制/移动可构造)类,如下所示:

#include <boost/variant.hpp>
#include <string>
#include <list>

struct A { A(int) { ; } };
struct B { B(std::string) { ; } };
struct C { C(int, std::string) { ; } };

using V = boost::variant< A const, B const, C const >;
using L = std::list< V >;

int main()
{
    L l;
    l.push_back(A(1)); // an extra copy/move operation
    l.push_back(B("2")); // an extra copy/move operation
    l.push_back(C(3, "3")); // an extra copy/move operation
    l.emplace_back(4);
    l.emplace_back(std::string("5"));
    // l.emplace_back(3, std::string("3")); // error here
    return 0;
}

我希望,这std::list::emplace_back允许我构造和插入(在单个操作中)新对象(所有A, B,C类型)到列表中,即使它们有T & operator = (T const &) = delete;/T & operator = (T &&) = delete;T(T const &) = delete;/ T(T &&) = delete;。但是,如果构造函数是非转换的,我该怎么办?即有多个参数。或者,如果两个不同变体的底层类型具有模棱两可的构造函数原型,我应该怎么做?在我看来,这是针对 C++11 标准的新特性实现库的缺陷boost::variant,如果有的话可以用来解决问题。

我专门询问了std::list和叠加,因为据我所知boost::variant,它们都在内部以某种形式实现了pimplboost::variant习惯用法(例如,目前是通过临时堆备份方法设计的)。

4

2 回答 2

1

emplace只能调用相关类型的构造函数。Andboost::variant的构造函数只接受可以明确转换为变体类型之一的单个对象。

variant不会将参数任意转发到其有界类型之一。它只需要一个值。它将尝试转换为有界类型之一的单个值。

因此,您将不得不构造一个对象,然后将其复制到variant.

于 2013-05-16T05:08:02.010 回答
1

假设你可以修改你的“C”类,你可以给它一个额外的构造函数,它接受一个元组参数。

于 2013-05-16T12:04:02.743 回答