2016-08-14 14 views
12

Mam niektóre kodu, który wygląda tak:Jak zwrócić NULL z metody matrycy, bez użycia wskaźnika

template <class T> 
T foo(T a) { 
if (a) { 
    // do somethin', returns object of type T 
} else { 
    return NULL; 
} 
} 

Ale oczywiście to nie będzie kompilować od NULL nie jest typu T. Someone sugeruje to rozwiązanie dla mnie, ale nie lubię go:

template <class T> 
T* foo(T a) { 
if (a) { 
    // do somethin', returns object of type T* 
} else { 
    return nullptr; 
} 
} 

Zastanawiam się jak sprawić, by ta funkcja może zwrócić wartość NULL, jeśli to możliwe bez użycia wskaźnika?

+0

Co powrócisz, gdy nie zwrócisz wartości null? – NathanOliver

+0

^obiekt typu T –

+0

Czy dotyczy to szablonów? –

Odpowiedz

13

W języku C++ 17 będzie można używać std::optional<T>. I można zrobić coś takiego:

template <class T> 
std::optional<T> foo(T a) { 
    if (a) { 
     // do somethin', returns object of type T 
     return std::make_optional(/*Anything that constructs `T`*/); 
    } else { 
     return {}; 
    } 
} 

i po stronie odbiorczej, można przetestować za wartość będąc tam:

auto my_val = foo(obj); 
if(my_val){ 
    /* :-) ....knock yourself out! */ 
} 
else{ 
    /* :-(....we didn't find the value */ 
} 

Na razie

  • Można użyć Boost.Optional.

  • Lub, jeśli korzystasz z najnowszego kompilatora, możesz mieć do niego dostęp od std::experimental::optional.

  • Lub, jeśli nie chcesz używać Boost i jego zależności, można po prostu chwycić tej tiny header (implementację roboczą opcjonalnie z jednym z proposers of optional do C++ standard) ... To jest nagłówek tylko, więc wystarczy pobrać/skopiować ten pojedynczy plik nagłówkowy i #include go.


Another cool thing with C++17 jest to, że badania dla wartości będą teraz tak proste, jak:

if(auto my_val = foo(obj); my_val){ 
    // ....knock yourself out! 
} 

Można zobaczyć więcej C++ 17 cech tutaj: What are the new features in C++17?

+0

Witam, jak używać C++ 17? Właśnie tego szukam, dziękuję za odpowiedź. –

+0

Właściwie to nie głupie, to było głupie pytanie, popatrzę na boost, dzięki –

+2

@Liz, jeśli nie chcesz używać Boost, możesz po prostu wziąć ten [mały nagłówek] (https://github.com/akrzemi1/ Opcjonalnie/blob/master/optional.hpp) (działająca implementacja opcjonalna) ... Jest to tylko nagłówek, więc wystarczy pobrać/skopiować ten pojedynczy plik nagłówka i "# include" go. – WhiZTiM

Powiązane problemy