0

テンプレートを持つクラスがあります:

 template<class T = int> class slider;

クラスにはvoid Process(void)メソッドがあるので、型に関係なく呼び出せるはずで、戻り値は void で、パラメーターはありません。

今のところ、アプリケーションで各フレームのプロセスを呼び出す次のコードがあります。

//class menu:
typedef boost::variant<std::shared_ptr<slider<int>>,std::shared_ptr<slider<float>>,std::shared_ptr<slider<double>>,std::shared_ptr<slider<char>>> slider_type;
std::map<std::string,slider_type> Sliders;
//buttons ... etc ...
void Process()
{
    if(!Sliders.empty())
    {
        for(auto i = Sliders.begin(); i != Sliders.end(); ++i)
        {
            switch(i->second.which())
            {
                case 0://slider<int>
                {
                    boost::get<std::shared_ptr<slider<int>>>(i->second)->Process();
                    break;
                }
                case 1://slider<float>
                {
                    boost::get<std::shared_ptr<slider<float>>>(i->second)->Process();
                    break;
                }
                //.....
            }
        }
    }
}

次の例のように関数 Process() を実行することは可能ですか?

    for(auto i = Sliders.begin(); i != Sliders.end(); ++i)
    {
        switch(i->second.which())
        {
            boost::get<???Any???>(i->second)->Process();
        }
    }

はいの場合、どのように?

4

4 に答える 4

5

そのような関数は何を返すでしょうか? 実行時に関数の型を変更することはできません。バリアントのポイントは、その内容が実行時に決定されることです。

返すことができる唯一のものはboost::any. これは実際には、ある種類の未知のものを別のものと交換しているだけです (何が含まれているかわからない場合、対処するのがはるかに難しい未知のものです)。しかし、そのような訪問者を見たい場合:

struct convert_to_any : public boost::static_visitor<boost::any>
{
  template<typename T> boost::any operator() (const T& t) {return t;}
};

その上で使用apply_visitorすると、anyバックが得られます。それがどのように役立つかわかりませんが。


いずれにせよ、 を使用getしているvariant場合は、ほぼ確実に間違ったことをしています。バリアントの要素にアクセスする正しい方法は、ではなく、ビジターgetを使用することです。

あなたの場合、訪問者は単純でなければなりません:

struct ProcessVisitor : public boost::static_visitor<>
{
  template<typename T> void operator() (const T& t) const {t->Process();}
};

その上で使用するだけapply_visitorです。バリアントに使用できる型が含まれていてoperator->、その関数の戻り値がそれを呼び出すことができるProcess場合、それはそうします。

于 2013-05-17T02:40:34.563 に答える
2

いいえ、まったくありません。あらゆるタイプのケースを訪問して処理する必要があります。これは、スイッチ ハックよりもビジターの方がはるかに優れています。

于 2013-05-17T01:37:08.927 に答える