3

ユニオンに格納されているパラメーターの数が異なる関数を持つクラスを定義しようとしています。クラスは、関数オブジェクトと必要なパラメーターで初期化されます。(1) および (2) とマークされた場所でこれらのコンパイラ エラーが発生します。

(1) バリアント フィールド 'f_V' に非自明なデストラクタがあるため、'_' のデストラクタが暗黙的に削除される

(2) フィールド「functions」のデストラクタが削除されているため、「MyClass」のデストラクタが暗黙的に削除されます

さまざまな関数オブジェクトの共用体を宣言し、渡されたパラメーターに応じて、適切な関数を選択して呼び出すことができるようにしたいだけです。これらのエラーが発生するのはなぜですか? また、このコードをどのように書き直せばよいですか?

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)
    ...
 };

編集:コンテナに可変引数リストを持つラムダ関数の格納を達成しようとしています。このようなもの:

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
}

注: 簡潔にするために、MyClass の () 演算子の定義を省略しましたが、適切なパラメーターを使用して適切な関数オブジェクトを呼び出すだけです。

これに対するより良い設計アプローチを見つけた場合は、正しい方向に向けてください。ありがとう!

4

1 に答える 1

3

C++11のunrestricted unions 機能を使用して、必要な操作を行うことができます。適切なアクティブ メンバーを構築/削除するユニオンに、カスタム コンストラクターとデストラクタを実装する必要があります。

于 2013-09-04T18:03:46.630 に答える