我有一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
习惯用法(例如,目前是通过临时堆备份方法设计的)。