gpt4 book ai didi

c++ - boost::function 与函数指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:02 24 4
gpt4 key购买 nike

我正在实现一个通用设置读取器。我的想法是我有一个应用程序,它的设置可以是 bool 值、整数和字符串。然后我有一个 Config 类,其中实现了此类设置的 getter,配置类在构造函数中接受了一个客户,因此它知道它将读取该客户的设置。

我在让它工作时遇到了麻烦,我想我误用了 boost::function,将它与普通函数指针混淆了。

在映射中,我希望有引用,而 boost::function 应该只在配置读取时绑定(bind),因为我已经为那里分配了一个 Config 实例给定的客户。

问题是我不能在没有 typedef 的情况下使用函数指针,这会使模板工作复杂化,有什么更明智的解决方案吗?

#include "Config.h"

class ConfigReader
{

ConfigReader();

template<class R>
R readConfig(std::string customer, std::string settingName);

private:

typedef bool (Config::* BoolConfigFunctor) () const;
std::map<std::string, BoolConfigFunctor> boolConfigMap;

typedef int(Config::* IntConfigFunctor) () const;
std::map<std::string, IntConfigFunctor> integerConfigMap;

typedef std::string (Config::* StrConfigFunctor) () const;
std::map<std::string, StrConfigFunctor> stringConfigMap;

template<class R>
std::map<std::string, R (Config::* ) () > getConfigMap();
}

ConfigReader()
{
// INIT all settings you want to be readable in the functor maps
boolConfigMap["USE_NEW_VERSION"] = &Config::useNewVersion;
boolConfigMap["MAINTENANCE_MODE"] = &Config::isMaintenance;
integerConfigMap["TIMEOUT"] = &Config::getTimeout;
stringConfigMap["USERNAME"] = &Config::getUserName;
...
}

template<class R>
R readConfig(std::string customer, std::string settingName)
{
R returnValue;

typedef typename std::map<AMD_STD::string, R (Config::* ) () > ConfigMap_t;
typedef typename ConfigMap_t::const_iterator ConfigMapIter_t;

ConfigMap_t configMap = getConfigMap<R>();
ConfigMapIter_t configIter = configMap.find(settingName);

if (configIter != configMap.end())
{
Config config(customer); // Real instance of Config against which we want to call the function

boost::function<R ()> configFunction;
configFunction =
boost::bind(
configIter->second,
config);

returnValue= configFunction();
}

return returnValue;
}

template<>
std::map<std::string, bool (Config::* ) ()> ConfigReader::getConfigMap()
{
return boolConfigMap;
}

template<>
std::map<std::string, int (Config::* ) ()> ConfigReader::getConfigMap()
{
return integerConfigMap;
}

template<>
std::map<std::string, string (Config::* ) ()> ConfigReader::getConfigMap()
{
return stringConfigMap;
}

更新它确实通过在 map 中使用函数引用而不是 boost::function

最佳答案

您不能将成员函数指针用作普通函数指针,除非成员函数是static。您应该改用 Boost bind具有特定对象实例:

boolConfigMap["USE_NEW_VERSION"] = boost::bind(&Config::useNewVersion, someInstanceOfConfig);

(非静态)成员函数指针与普通函数指针(或静态成员函数指针)不同的原因是成员函数有一个隐藏的“zeroeth”参数,即this 成员函数内部的指针。

此外,您对 boost::function 对象的声明应该只是例如

boost::function<bool()>

这将处理返回 bool 且不带参数的所有类型的函数。


如果您的编译器足够新,您可能还想更改为使用 std::functionstd::bind .


编辑后显示成员函数指针:您还必须正确调用函数指针,例如

(config.*configIter->second)();

关于c++ - boost::function 与函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19835239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com