Мой вопрос: как определить фабричную функцию, которая принимает параметр и возвращает указатель функции, указывающий на функцию, которая создается в соответствии с этим параметром? (или любой другой хороший способ достичь того же результата)
Объяснение
По сути, я хочу определить фабричную функцию 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")
с
void foo(std::string str)
{
std::cout << set(str) << ("this text is in " + str) << std::endl;
}
где set
берет "red"
и ищет карту code
для соответствующего кода "31"
.
Но у меня проблемы с реализацией функции set
. Буду очень признателен, если кто-нибудь сможет мне помочь с этим!
Две ноты:
Если возможно, я хочу хорошую производительность для функции set
, так как она будет вызываться снова и снова.
Простите, пожалуйста, если я думаю, что неправильно --- Пока вы можете реализовать функциональность для set
, я не против, чтобы вы делали это по-другому.
Спасибо, что прочитали этот длинный пост. Большое спасибо!