C ++: Как заставить функцию возвращать только те строки, которые являются частью списка? - PullRequest
0 голосов
/ 02 ноября 2018

Я хочу, чтобы моя функция возвращала строку, но только строки, которые являются членами определенного списка / набора строк. Как я могу сделать это?

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Вы не хотите возвращать строку, вы хотите вернуть строку, имеющую дополнительное ограничение (являющееся частью некоторого предопределенного набора).

Для этого вам понадобится новый тип:

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

И в вашем приложении вы будете работать с этим типом, получая при необходимости доступ к значению.

0 голосов
/ 02 ноября 2018

Вы можете сделать это 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;
}
0 голосов
/ 02 ноября 2018

Мотыга об использовании 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 throw и catch.

Если это означает возврат std::string, если str находится в предопределенном списке, но void, если его нет, вам могут потребоваться некоторые приемы, как описано в <type_traits>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...