【发布时间】:2019-07-11 13:43:10
【问题描述】:
我的问题是:如何定义一个工厂函数,它接受一个参数并返回一个指向根据该参数创建的函数的函数指针? (或任何其他实现相同结果的好方法)
说明
本质上,我想定义一个工厂函数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;
我会得到想要的效果。到目前为止一切顺利。
现在有了地图
std::map<std::string, std::string> code =
{
{"black", "30"},
{"red", "31"},
{"green", "32"}
// ...
// could extend much longer as there are many colors
};
我希望用foo("red") with 实现类似的自定义效果
void foo(std::string str)
{
std::cout << set(str) << ("this text is in " + str) << std::endl;
}
其中set 获取"red" 并在地图code 中查找对应的代码"31"。
但是我在实现set 函数时遇到了问题。如果有人能帮我解决这个问题,我将不胜感激!
两个音符:
如果可能,我希望
set函数具有良好的性能,因为它会被一次又一次地调用。如果我想错了,请见谅 --- 只要你能实现
set的功能,我不介意你用不同的方式来做。
感谢您阅读这篇长文。非常感谢!
【问题讨论】:
-
returns a function pointer pointing to a function that is created according to that parameter无法在运行时创建函数。 -
在 C++11 中使用 lambda 函数绝对是可能的。