我有这样的课堂场景:
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
由于
答案 0 :(得分:3)
让我们分一步。
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
的调用,而您无法将Scene &
与std::string
进行比较
在C ++ 11中,编写一个与上述结构完全相同的lambda很容易。
[&sceneName] (const Scene &theScene ) { return theScene.GetSceneName () == sceneName; }
但是你不想要c ++ 11,所以你必须写下这样的东西:
boost::bind ( std::string::operator ==, sceneName, _1.GetSceneName ());
但这不起作用,因为它会在调用bind中调用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上的文档。
答案 1 :(得分:0)
最短路可能是手动循环:
BOOST_FOREACH(Scene& scene, mScenes) {
if (scene.GetSceneName() == sceneName) return &scene;
}
return 0;