2

boost::function以下に定義するように、値を含むマップがあります。

std::map <std::string, boost::function<std::string (std::string, int)> > handlers;

次の関数を定義するとします。

using namespace std;
string substring (string input, int index = 0){
    if (index <= 0){
        return input;
    }
    stringstream ss;
    for (int j = index; j<input.length(); j++){
        ss << input[j];
    }

    return ss.str();
}

これをハンドラーマップに保存できるようにしたいのですが、WITHはオプションのパラメーターです。ブーストにはこれを実行する方法がありますか?私は見ましたboost::optionalが、それは私が望むことをしていないようです。

編集

もう少し背景を説明するために、辞書(typedef std::map < std::string, std::string > dictionary)などへのポインターなど、追加の引数を必要とするハンドラーがいくつかあります。これらのハンドラーは、その辞書に変更を加えるためです。ただし、ハンドラーの大部分は問題の辞書にアクセスしませんが、すべてを同じマップに格納するには、すべて同じ引数を取る必要があります(のテンプレートは同じですboost::function)。目標は、辞書をまったく処理しない関数を、A)辞書を渡して使用しないという唯一の目的で辞書を作成するか、B)コードをそのまま別の関数にコピーすることなく使用できるようにすることです。その引数は必要ありません。

上記のコードは、私が行っていることの単純化された例です。

4

1 に答える 1

2

簡単な答え:これは、多くの追加コードがないとC++では不可能です。

長い答え: C ++の関数引数のデフォルト値は、関数の名前
が表示 されるコンテキストで必要な場合にのみ使用されます。他の手段(関数ポインター、またはなど)を使用して関数を呼び出す場合、デフォルトの引数が存在する可能性があるという情報はコンパイラーで使用できないため、コンパイラーはそれらを入力できません。boost::function/std::function

背景として、これはC ++でのデフォルトの引数の動作方法です。
substring(MyString)(with std::string MyString = "something")がある場合、コンパイラーは呼び出されたすべての関数を検索しsubstring、を見つけstring substring(string, int=0)ます。この関数は2つのパラメーターを取り、そのうちの1つはデフォルト値を持つことができ、関数を実行可能にします。実際に関数を呼び出すために、コンパイラーはソースコードを変更して、substring(MyString, 0)その適応に基づいてコードを読み取り、生成に進みます。

を介したような間接呼び出しでデフォルト値を使用できるようにするboost::functionには、コンパイラのデフォルトの引数メカニズムを効果的にエミュレートする必要があります。

于 2013-01-02T16:48:46.853 に答える