C++:如何使函数只返回作为列表一部分的字符串

C++: How to make function return only strings which are a part of a list?

本文关键字:列表 一部分 字符串 返回 何使 函数 C++      更新时间:2023-10-16

我希望我的函数返回一个字符串,但只返回作为特定字符串列表/集合成员的字符串。我该怎么做?

您不希望返回字符串,而是希望返回一个具有附加限制的字符串(作为某个预定义集合的一部分(。

为此,你需要一种新的类型:

class BusinessStringWrapper {
public:
BusinessStringWrapper(std::string arg): value{arg} {
if (/* arg is not ok */) {
throw;
}
}
// you can replace that with factory method
// can also return std::optional instead of throwing if the condition is not met
// that depends on your application
std::string value() const { return value; }
private:
const std::string value;
};

在您的应用程序中,您可以对这种类型进行操作,并在需要时访问值。

想使用std::set<std::string>吗?

#include <iostream>
#include <set>
#include <string>
std::string helper(const std::string & str,
const std::set<std::string> & lst)
{
return lst.find(str) == lst.end() ? "" : str;
}
int main()
{
std::set<std::string> lst = {"alpha", "beta", "gamma"};
std::cout << "return " << helper("alpha", lst) << "n";
std::cout << "return " << helper("zeta", lst) << "n";
return 0;
}

输出

return alpha
return

当然,这实际上取决于您对的定义是什么

如果它意味着一个空字符串,那么使用上面的解决方案。保持你的生活简单。

如果这意味着一个错误,程序应该终止,你可以#include <cassert>

assert(lst.find(str) != lst.end());

如果这意味着要处理的异常,则可以使用trythrowcatch

如果这意味着如果str在预定义列表中,则返回std::string,如果不在,则返回void,那么您可能需要<type_traits>中描述的一些技巧。

您可以在下面的示例中执行std::map<CardType, std::string>,或者使用std::map<int, std::string>将字符串与任何整数关联。例如mp[123]="abcd"

#include <iostream>
#include <string>
#include <map>
enum CardType {
SPADE,
HEART,
CLUBS,
DIAMD
};
std::map<CardType, std::string> mp{ 
{CardType::SPADE, "Spade"},
{CardType::HEART, "Heart"},
{CardType::CLUBS, "Clubs"},
{CardType::DIAMD, "Diamond"}
};
int main()
{
std::cout << mp[CardType::SPADE] << std::endl;
return 0;
}