C++ 在C+中使用带并集的std::function+;11

C++ 在C+中使用带并集的std::function+;11,c++,c++11,C++,C++11,我试图定义一个类,该类的函数在一个联合中存储了不同数量的参数。使用函数对象和必要的参数初始化该类。我在标记为(1)和(2)的位置收到这些编译器错误 (1) “u”的析构函数被隐式删除,因为变量字段“f_V”有一个非平凡的析构函数 (2) “MyClass”的析构函数被隐式删除,因为字段“functions”有一个已删除的析构函数 我只想声明不同函数对象的并集,并根据传入的参数选择合适的函数并调用它。为什么会出现这些错误?我应该如何重写这些代码 template<typename VARIA

我试图定义一个类,该类的函数在一个联合中存储了不同数量的参数。使用函数对象和必要的参数初始化该类。我在标记为(1)和(2)的位置收到这些编译器错误

(1) “u”的析构函数被隐式删除,因为变量字段“f_V”有一个非平凡的析构函数

(2) “MyClass”的析构函数被隐式删除,因为字段“functions”有一个已删除的析构函数

我只想声明不同函数对象的并集,并根据传入的参数选择合适的函数并调用它。为什么会出现这些错误?我应该如何重写这些代码

template<typename VARIABLE> struct MyClass {
    MyClass(VARIABLE *p, const std::function<void (VARIABLE&)>& f) {
        functions.f_V = f;
        ...
    }
protected:
    union _ {
        std::function<void (VARIABLE &)> f_V; // (1)
        std::function<void (const VARIABLE &, VARIABLE &)> f_vV;
        std::function<void (const VARIABLE &, const VARIABLE &, VARIABLE &)> f_vvV;
        std::function<void (const VARIABLE &, const VARIABLE &, const VARIABLE &, VARIABLE &)> f_vvvV;
    } functions; // (2)
    ...
 };
模板结构MyClass{
MyClass(变量*p,常数std::函数&f){
函数f_V=f;
...
}
受保护的:
工会{
std::函数f_V;/(1)
标准:功能f_vV;
std::函数f_vvV;
标准:功能f_vv;
}功能;/(2)
...
};
编辑:我正在尝试在容器中存储具有可变参数列表的lambda函数。大概是这样的:

std::vector<MyClass<MyVariable>> myContainerOfLambdas;
MyVariable A,B,TO;
auto lambda1 = [this](const MyVariable& a, MyVariable& to) { ... };
myContainerOfLambdas.push_back(MyClass<MyVariable>(A,TO,lambda1));
auto lambda2 = [this](const MyVariable& a, const MyVariable& b, MyVariable& to) { ... };
myContainerOfLambdas.push_back(MyClass<MyVariable>(A,B,TO,lambda2));
...
// iterate over the stored MyClass objects holding the lamda functions and the parameters
// to call them
for(MyClass<MyVariable> & e:myContainerOfLambdas) {
  e(); // here the appropriate lambda function will be invoked with the appropriate values
  // stored in MyClass
}
std::载体支原体;
MyVariable A,B,TO;
自动lambda1=[this](常量MyVariable&a,MyVariable&to){…};
向后推(MyClass(A,TO,lambda1));
自动lambda2=[this](常量MyVariable&a,常量MyVariable&b,MyVariable&to){…};
向后推(MyClass(A,B,TO,lambda2));
...
//迭代保存有lamda函数和参数的MyClass对象
//叫他们
适用于(MyClass&e:myContainerOfLambdas){
e();//这里将使用适当的值调用适当的lambda函数
//存储在MyClass中
}
注意:为简洁起见,我省略了MyClass中()运算符的定义,但它只是使用正确的参数调用正确的函数对象


如果你看到一个更好的设计方法,好的,请告诉我正确的方向。谢谢

您可以使用C++11的。您需要在构造/删除适当活动成员的联合上实现自定义构造函数和析构函数。在C++中不要使用<代码>联合< /COD>。改用
boost::variant
union
只能在C代码中使用。@Mooing Duck:我正在尝试存储lambda函数。除了使用一个联合体,你建议我在这里做什么?@andrewz:要么存储所有的联合体,要么使用
boost::variant
@andrewz那么,为什么需要包装
std::function
?使用
std::function
@MooingDuck可以轻松完成您需要的操作“如果一个对象有析构函数,它就不能在并集中”,而不是在C++11中。您可以将具有非平凡dtor的对象放入联合中,只需为联合提供自定义dtor。尽管您可能需要将其作为(匿名)联合嵌入(非联合)类中,以存储哪个成员处于活动状态。联合可能有一个空的dtor,对活动成员的显式dtor调用是从周围的类“dtor”完成的。@DyP:正确,因为析构函数需要访问活动成员的索引,而索引不能是联合的成员。@user1131467:实际上,一旦完成了所有这些操作,您只需重新发明
boost::variant
,但效果很差。@MooingDuck:我将开始关注
boost::whatever
,如果它变成
std::whatever
:)