gpt4 book ai didi

c++ - 不同类型的 boost 功能图?

转载 作者:可可西里 更新时间:2023-11-01 18:36:29 28 4
gpt4 key购买 nike

我想知道在 C++ 中是否有办法做到这一点?

void func1(const std::string& s)
{
std::cout << s << std::endl;
}

void func2(int me)
{
std::cout << me << std::endl;
}

int main()
{
std::map<std::string, boost::function< ??? > > a_map;

a_map["func1"] = &func1;
a_map["func1"]("HELLO");

}

有什么方法可以使用 boost 函数和 map 来完成我上面的操作吗?

最佳答案

有一些方法可以存储函数,问题是,为了能够用所需的参数调用函数,无论如何你都必须知道函数的调用签名,如果你有这些信息,你还不如使用单独的映射,或者使用比 boost::function 更复杂的对象。

如果您愿意做一些工作并且拥有有限数量的签名,您可以这样做:

class MultiFunc
{
protected:
MultiFunc() {}

public:
typedef void (*stringFunc)(const std::string&);
typedef void (*intFunc)(int);

static MultiFunc *Create(stringFunc function);
static MultiFunc *Create(intFunc function);

virtual void operator()(const string &) { throw exception(); }
virtual void operator()(int) { throw exception(); }
virtual ~MultiFunc();
};

class MultiFuncString : public MultiFunc
{
private:
stringFunc Function;
public:
MultiFuncString(stringFunc function) : Function(function) {}
virtual void operator()(const string &arg) { Function(arg); }
};

class MultiFuncInt : public MultiFunc
{
private:
intFunc Function;
public:
MultiFuncInt(intFunc function) : Function(function) {}
virtual void operator()(int arg) { Function(arg); }
};

MultiFunc *MultiFunc::Create(MultiFunc::stringFunc function)
{
return new MultiFuncString(function);
}
MultiFunc *MultiFunc::Create(MultiFunc::intFunc function)
{
return new MultiFuncInt(function);
}

void func1(const std::string& s)
{
std::cout << s << std::endl;
}
void func2(int me)
{
std::cout << me << std::endl;
}

int main()
{
map<string, MultiFunc *> a_map;
a_map["func1"] = MultiFunc::Create(&func1);
(*a_map["func1"])("Hello");
a_map["func2"] = MultiFunc::Create(&func2);
(*a_map["func2"])(3);

// Remember to delete the MultiFunc object, or use smart pointers.
}

这个输出:

Hello3

不幸的是,您不能创建模板化的虚函数,否则您很容易将其泛化。

关于c++ - 不同类型的 boost 功能图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/646737/

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