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

时间:2018-11-02 01:13:46

标签: c++ types enums

我希望我的函数返回一个字符串,但仅返回属于特定列表/字符串集的成员的字符串。我该怎么做呢?

3 个答案:

答案 0 :(得分:0)

愿意使用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());

如果这意味着要处理的异常,则可以try throwcatch

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

答案 1 :(得分:0)

您不想返回一个字符串,而是想返回一个具有附加限制(属于某些预定义集合的一部分)的字符串。

为此,您需要一个新类型:

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;
};

在您的应用程序中,您将使用此类型,并在需要时访问值。

答案 2 :(得分:0)

您可以在下面的示例中使用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;
}