c++ - 定义一个工厂函数,该函数返回指向在此工厂函数中创建的函数的指针

标签 c++ c++11

我的问题是:如何定义一个接受参数并返回指向根据该参数创建的函数的函数指针的工厂函数? (或任何其他获得相同结果的好方法)


解释

本质上,我想定义一个工厂函数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 时遇到了问题功能。如果有人能帮助我,我将不胜感激!

两个注意事项:

  1. 如果可能的话,我希望 set良好的性能函数,因为它将被一次又一次地调用。

  2. 如果我想错了请原谅我--- 只要你能实现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/

相关文章:

c++ - 如何在外语和返回共享指针的 C++ 库之间进行接口(interface)

c++ - 如何更改 dynamic_bitset 的值?

c++ - 将 const char* 返回到 char* 然后更改数据

C++ 模板 : call whichever function matches between 2 choices

c++ - tr1::unique_ptr 和 SelectObject()

c++ - 查找 vector C++ 的唯一元素

c++ - 可变模板上下文中 "..."标记的规则是什么?

c++ - 确定 C++ 类是否具有私有(private)析构函数

c++ - Sqlite3,我不明白为什么我的指针返回为空

c++ - 具有不完整类型的非共享智能指针