Как разрешить параметру std:string быть NULL?

У меня есть функция foo(const std::string& str);, которая падает, если вы вызываете ее с помощью foo(NULL).

Что я могу сделать, чтобы предотвратить его сбой?


person bogdan    schedule 30.07.2011    source источник
comment
Что вы делаете с str внутри foo ? Если вы проверяете, является ли str значением NULL, и изящно выходите из функции, она не должна падать.   -  person arunkumar    schedule 30.07.2011
comment
Вам дали несколько полезных советов, но уверены ли вы, что подходите к этому правильно? Почему вы используете указатель? Часть красоты std::string (и ссылок) заключается в том, что вам не нужно возиться с указателем. (Как правило)   -  person John    schedule 30.07.2011
comment
Это также является причиной печально известной вещи std::string s(false).   -  person Seth Carnegie    schedule 30.07.2011
comment
Доктор, доктор, мне больно, когда я это делаю! ;-)   -  person Steve Jessop    schedule 30.07.2011


Ответы (3)


std::string имеет конструктор, который принимает параметр const char*. Этот конструктор рухнет, когда вы передадите ему NULL, и этот конструктор вызывается неявно, когда вы пишете foo(NULL).

Единственное решение, которое я могу придумать, это перегрузить foo

void foo(const std::string& str)
{
  // your function
}

void foo(const char* cstr)
{
  if (cstr == NULL)
    // do something
  else
     foo(std::string(cstr)); // call regular funciton
}
person jahhaj    schedule 30.07.2011
comment
+1. Я удалил свой собственный ответ после того, как @James McNellis правильно указал, что я каким-то образом упустил из виду ключевой момент ... - person Alexander Gessler; 30.07.2011

Вы можете использовать Boost.Optional.

#include <boost/optional.hpp>
#include <string>

using namespace std;
using namespace boost;

void func(optional<string>& s) {
    if (s) {  // implicitly converts to bool
        // string passed in
        cout << *s << endl; // use * to get to the string
    } else {
        // no string passed in
    }
}

Чтобы вызвать его строкой:

string s;
func(optional<string>(s));

и без строки:

func(optional<string>());

Boost.Optional предоставляет безопасный для типов способ иметь значения, допускающие значение NULL, не прибегая к указателям и связанным с ними проблемам.

person Ferruccio    schedule 30.07.2011
comment
option теперь существует в C++17 как std::Optional. - person Zitrax; 07.12.2016

У вас есть функция, которая принимает std::string, поэтому предоставьте ей std::string, а не указатель.

foo(std::string());

Это предоставит функции пустую строку, которую вы, вероятно, интерпретировали бы как нулевое значение.

person Dennis Zickefoose    schedule 30.07.2011