문제
업데이트 된 요구 사항에 따른 질문 업데이트
먼저 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 또는 ""와 같은 대역 내 값을 사용하는 것보다 변수 세트를 갖지 않으려는 의도에 대한 훨씬 더 나은 지표입니다.
제휴하지 않습니다 StackOverflow