2

我有一个这样的课堂场景:

class Renderer;

class Scene
{
public:
    Scene(const std::string& sceneName);
    ~Scene();

    void Render(Renderer& renderer);

    Camera& GetSceneCamera() const;
    SceneNode& GetRootNode() const;
    const std::string& GetSceneName() const;


private:
    const std::string mName;
    Camera mSceneCamera;
    SceneNode mRootNode;
};

然后我有一个场景向量 ( vector<Scene>)。

现在给定一个字符串,我想遍历这个场景向量,如果在场景中找到名称,则返回一个指向它的指针。这是一个天真的尝试,但我遇到了编译错误:

Scene* SceneManager::FindScene(const std::string& sceneName)
{
    return std::find_if(mScenes.begin(), mScenes.end(), boost::bind(&std::string::compare, &sceneName, _1));
}

Boost 抱怨参数的数量,所以我的语法一定是错误的.. 这样做的正确方法是什么?

编辑:No instance of overloaded boost::bind matches the argument list

EDIT2:不是 C++11

谢谢

4

2 回答 2

4

让我们分步进行。

find_if 将为向量中的每个元素调用一个比较函数,当比较函数返回 true 时停止。该函数需要可以使用const Scene &参数调用。

我们可以这样写(所有这些代码都未经测试)

struct SceneComparatorName {
    SceneComparatorName ( std::string &nameToFind ) : s_ ( nameToFind ) {}
    ~SceneComparatorName () {}
    bool operator () ( const Scene &theScene ) const {
        return theScene.GetSceneName () == s_;
        }
    std::string &s_;
    };

现在 - 你如何内联编写它?您的尝试boost::bind失败,因为您错过了对 的调用GetSceneName,并且您无法将 aScene &与 a进行比较std::string

在 C++11 中

编写一个完全符合上述结构的 lambda 是很容易的。

[&sceneName] (const Scene &theScene ) { return theScene.GetSceneName () == sceneName; }

但是你不想要 c++11,所以你必须写这样的东西:

boost::bind ( std::string::operator ==, sceneName, _1.GetSceneName ());

但这不起作用,因为它将在调用中调用 GetSceneName,而不是在调用 bind 创建的仿函数时调用。

但是,Boost.Bind 支持重载运算符,因此您只需编写:

    boost::bind ( &Scene::GetSceneName, _1 ) == sceneName

并完成。有关更多信息,请参阅http://www.boost.org/doc/libs/1_52_0/libs/bind/bind.html#nested_binds上的文档。

于 2012-12-24T01:19:40.700 回答
0

最短的方法可能是手动循环:

BOOST_FOREACH(Scene& scene, mScenes) {
    if (scene.GetSceneName() == sceneName) return &scene;
}
return 0;
于 2012-12-24T00:02:04.590 回答