1

文字列 (実際にはシェーダー文字列です) の検索と置換を効率的に実行する方法が必要だったので、少し調べた結果、boost::replace_all を思いつきました。私の関数には、文字列とベクトルまたはペアが渡されます。各ペアは文字列のペアです。検索して文字列に置き換えます。この一連の置換を繰り返し、その過程で文字列を変更したいと考えています。これが私が思いついたものです:

void 
Shader::Read(ShaderTypes type, std::string const & shader, std::vector<std::pair<std::string, std::string>> const & replace)
{
    // Perform search and replace on input string.

    std::string newShader = shader;

    std::for_each(replace.begin(), replace.end(), [newShader](std::pair<std::string, std::string> const & pair) {
        boost::replace_all(newShader, pair.first, pair.second);
    });




    // Create and compile shader.

    Read(type, newShader);
}

今、これはコンパイルされません。ブーストから大量のエラーが発生します。ペアが const であることと関係があると思いますが、100% 確実ではありません。std::pair を手動で作成して replace_all を呼び出すと、うまくいきました。ただし、ラムダから到着する形式は好きではありません。

誰でも私を助けてもらえますか?

4

2 に答える 2

2

newShader参照によってキャプチャする必要があります。

std::for_each(replace.begin(), replace.end(), [&newShader](...
于 2012-11-29T10:37:46.550 に答える
1

ラムダへの参照によって newShader を渡す必要があると確信しています。名前を付ける必要はありません。[&] で自動的にキャプチャできます。

于 2012-11-29T10:41:27.973 に答える