我的问题是:如何定义一个接受参数并返回指向根据该参数创建的函数的函数指针的工厂函数? (或任何其他获得相同结果的好方法)
解释
本质上,我想定义一个工厂函数set
,它需要一个 std::string
参数str
, 并返回指向函数 pf
的指针.函数指针pf
指向一个函数,刚刚在 set
中创建,这需要 std::ostream &
并返回 std::ostream &
.
这样我想用std::cout << set(str) << "text" << std::endl;
来调用.我希望 set(str)
的结果至少与此声明一样长。
供您引用,来自cplusplus那个
ostream & operator<< (ostream & (*pf)(ostream &));
更多说明
这是一个真实的例子,如下图所示。
首先我有操纵器
std::ostream & black(std::ostream & os)
{
return os << "\033[30m"; // make terminal text black
}
std::ostream & red(std::ostream & os)
{
return os << "\033[31m"; // make terminal text red
}
std::ostream & green(std::ostream & os)
{
return os << "\033[32m"; // make terminal text green
}
所以当我打电话
std::cout << red << "this text is in red" << std::endl;
我会得到想要的效果。到目前为止一切顺利。
现在有了 map
std::map<std::string, std::string> code =
{
{"black", "30"},
{"red", "31"},
{"green", "32"}
// ...
// could extend much longer as there are many colors
};
我希望通过 foo("red")
实现类似的定制效果与
void foo(std::string str)
{
std::cout << set(str) << ("this text is in " + str) << std::endl;
}
哪里set
需要 "red"
并查找 map code
对应代码"31"
.
但我在实现 set
时遇到了问题功能。如果有人能帮助我,我将不胜感激!
两个注意事项:
如果可能的话,我希望
set
有良好的性能函数,因为它将被一次又一次地调用。如果我想错了请原谅我--- 只要你能实现
set
的功能就行了,我不介意你用不同的方式来做。
感谢您阅读这篇长文。非常感谢!
最佳答案
你想错了。您需要做的是创建您自己的参数化操纵器。这样的操纵器可以作为一个单独的类实现,您必须为其重载 operator<<
:
struct set_color
{
std::string name;
explicit set_color(std::string name)
: name(std::move(name)) { }
friend std::ostream & operator<<(std::ostream & os, const set_color &color)
{
if (color.name == "black")
os << "\033[30m";
else if ... // and so on
...
}
}
您可以使用 map
而不是将名称转换为颜色代码,但基本思想是不需要为此创建一堆函数。
关于c++ - 定义一个工厂函数,该函数返回指向在此工厂函数中创建的函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56990662/