2

特定の文字列を整数に変換する次のユーティリティ関数があります。

class convertToInt:public std::unary_function<const char*, int>
{

        public:
                int operator()(const char* cNumber)
                {
                        try
                        {
                                int result = boost::lexical_cast<int>(cNumber);
                                return result;
                        } catch ( boost::bad_lexical_cast& error)
                        {
                                std::cerr << "Error in converting to number "<< error.what() << std::endl;
                                return -1;
                        }
                }

};

このユーティリティ関数を実際に使用したい場合は、次のことを行う必要があります。

  convertToInt cStrToInt;
  int iNumberToCheck = cStrToInt(argv[1]);

私はちょうど疑問に思っています、方法はありますか、私は直接呼び出すことができます

int iNumberToCheck = convertToInt(argv[1]);
4

5 に答える 5

1

インスタンスを必要としないように、関数を静的にすることができます。呼び出しは範囲指定する必要があります。

(名前付き変数を使用するのではなく) より大きな式の一部として一時変数を作成することもできます。これは効率が悪いように見えるかもしれませんが、実際にはおそらくコンパイラによって同じものに最適化されます。

追加する編集: staticoperator() では機能しないため、そのオプションを使用するにはやり直す必要があります。

于 2013-05-04T18:26:13.720 に答える
0

この非常に単純なケースでは、他の人が指摘しているように、匿名オブジェクトはおそらくうまく機能します。ただし、状態を持つより複雑なクラスがある場合は、シングルトン パターンを検討してください。

class SingletonFunctor
{
    private:

        // some private state

        // for a hybrid approach, the constructor could be public
        SingletonFunctor()
        {
            // initialize state
        }

     public:

        static const SingletonFunctor& GetSingleton()
        {
            static const SingletonFunctor _singleton;

            return _singleton;
        }

        SomeType operator() (SomeOtherType param) const
        {
            // do something interesting
        }            
};

int main (void)
{
    SomeType firstVal = SingletonFunctor::GetSingleton()(SomeOtherType());

    // ...
    // later

    // no need to instantiate another object
    SomeType secondVal = SingletonFunctor::GetSingleton()(SomeOtherType());
}

状態を変更する場合は、このパターンに注意してください。グローバル変数と同じ問題が発生する可能性があります (特にマルチスレッドの場合)。

于 2013-05-05T02:18:18.700 に答える