문제


업데이트 된 요구 사항에 따른 질문 업데이트
먼저 null 요소가 아닌 요소를 반환하거나 예외를 던져야하는 다음 기능을 구현했습니다.
또한 'Max', 'Min', 'Pair'와 같은 고전적이고 짧은 이름을 발명 할 수 있습니까?

template <typename T>
T select_first_not_empty( const T& a, const T&b )
{
    static T null = T();

    if ( a == null && b == null )
        throw std::runtime_error( "null" );

    return
        a != null ? a : b;
}

int main()
{
    const int a1 = 2;
    const int b1 = 0;

    const int* a2 = 0;
    const int* b2 = new int(5);

    const std::string a3 = "";
    const std::string b3 = "";

    std::cout << select_first_not_empty( a1, b1 ) << std::endl;
    std::cout << select_first_not_empty( a2, b2 ) << std::endl;
    std::cout << select_first_not_empty( a3, b3 ) << std::endl;

    return 0;
}
도움이 되었습니까?

해결책

다음에 시도 할 수 있습니다

template < typename T >
T get_valuable( const T& firstValue, 
                const T& alternateValue, 
                const T& zerroValue = T() )
{
    return firstValue != zerroValue ? firstValue : alternateValue;
}

// usage
char *str = "Something"; // sometimes can be NULL
std::string str2 ( get_valuable( str,  "" ) );

// your function
template <typename T>
T select_first_not_empty( const T& a, 
                          const T& b, 
                          const T& zerroValue = T() )
{
    const T result = get_valuable( a, b, zerroValue );
    if ( result == zerroValue )
    {
        throw std::runtime_error( "null" );
    }
    return result;
}

다른 팁

C#에는 비슷한 기능이 내장 작업자가 있습니다 ??, 나는 Coalesce라고 생각합니다.

Perl 's || (단락 논리적 OR) 연산자도 비슷한 기능을 가지고 있습니다. 반환 0 또는 1 대신 True로 평가하는 첫 번째 인수의 값을 반환합니다.

0 || 7

1 또는 1이 아닌 7을 반환합니다 true C C ++ 또는 C# 프로그래머는 예상 할 것입니다.

C ++가 내장 한 가장 가까운 것은 Find_if 알고리즘입니다.

vector<int> vec;
vec.push_back(0);
vec.push_back(0);
vec.push_back(7);

vector<int>::iterator first_non_0 = 
    find_if(vec.begin(), vec.end(), bind2nd(not_equal_to<int>(), 0));

T에 대한 CTOR가 중요한 일을하면 "select_first_not_empty"를 통해 매번 세 번 수행하는 것처럼 보입니다.

더 나은 이름을 찾고 있다면 Oracle은 비슷한 "Coalesce"라고 부릅니다.

그래도 요점이 무엇인지 잘 모르겠습니다. 무언가가 설정되었는지 여부를 정말로 알고 싶었다면, 나는 참조 대신 무효화 할 수있는 포인터를 사용할 것입니다. "NULL"은 0 또는 ""와 같은 대역 내 값을 사용하는 것보다 변수 세트를 갖지 않으려는 의도에 대한 훨씬 더 나은 지표입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top