0

ここに問題があります:Factoryというクラスには、同じシグネチャのいくつかの非静的メンバー関数があります。f1f2などと呼ばせてください。私はstd::vectorのメンバー関数へのポインタをstatic constとしたいのですが、実行時にこれを変更する必要はありません。同様に、優雅さの理由から、私はf1と他のもの(以下では概括的にfi)を公開するのではなく、vectorでも公開しませんが、それは副次的です。それは不完全なタイプだから、クラスvectorを動作しません初期化プライベートフィールドを参照するstatic constクラスメンバーオブジェクトを初期化するにはどうすればよいですか?

、および&Factory::fiは、その時点では不明です。 fiはプライベートなので、ファイルレベルの外部で初期化することはできません。はグローバルスコープにはなりません。それを初期化関数に入れて、friendを実行すると、が書き換えられないので、constを書き換える必要があります。どのような作品

は次のとおりです。

  • は、インスタンスごとに、このvectorの不要なコピーを作成することを犠牲にし、static const修飾子を取り除きます。

  • static変数を宣言し、それを返すstaticメンバ関数を記述します。これと同じようになると思ったが、すべての最適化を実行してプログラムを2倍遅く実行させる。

確かに、後者の欠点のない解決方法を見たいと思います。 switchまたはそれに類似する膨大なパラダイムの変更から機能を呼び出すようにアドバイスしないでください。

答えて

1

これはあなたの頭にあるものですか?問題の声明からは明らかではなかった。私が試したし、(Qの第二段落の2番目のケース)が動作しませんでしたアプローチの一つだ

#include <vector> 

class Factory { 
private: 
    void f1() {} 
    void f2() {} 
public: 
    typedef void (Factory::*PF)(); 
    static const std::vector<PF> v; 
}; 

const std::vector<Factory::PF> Factory::v{&Factory::f1, &Factory::f2}; 


int main() 
{ 
    Factory f; 
    (f.*Factory::v[0])(); 
} 

Demo

+0

。 "エラー:[署名...] Factory :: f1()はこのコンテキスト内でプライベートです"と表示されます。まあ、あなたの*例ではありません。そのコードが現在のコードとどのように大きく異なるかを調べる必要があります。 –

+0

そしてわかりませんが、申し訳ありませんが、私はどこに見えません。あなたのコードはまさに私が心に留めているシナリオです。不思議なことに、これは単独で動作します(そして私が最初に試した方法の1つです)が、私の大きなプロジェクトでは上記のエラーが発生します。 –

+0

@TheVeeさらに詳しいサポートが必要な場合は、エラーを再現する[MCVE](http://stackoverflow.com/help/mcve)を表示してください。私は見ることができないコードを助けることはできません。 –

関連する問題