У меня есть функция foo(const std::string& str);
, которая падает, если вы вызываете ее с помощью foo(NULL)
.
Что я могу сделать, чтобы предотвратить его сбой?
У меня есть функция foo(const std::string& str);
, которая падает, если вы вызываете ее с помощью foo(NULL)
.
Что я могу сделать, чтобы предотвратить его сбой?
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
}
Вы можете использовать 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, не прибегая к указателям и связанным с ними проблемам.
У вас есть функция, которая принимает std::string
, поэтому предоставьте ей std::string
, а не указатель.
foo(std::string());
Это предоставит функции пустую строку, которую вы, вероятно, интерпретировали бы как нулевое значение.
std::string s(false)
. - person Seth Carnegie   schedule 30.07.2011