, tuple
은 일반적인 코드에 사용되어야한다
태그는 기본적으로 몇 가지 독특한 개념 니모닉입니다.
필드 1이 숫자 또는 치킨 인 경우, tuple
을 사용하면 안됩니다. 에 Number
이라는 입력란을 사용해야합니다. 당신이 (하나처럼) 튜플과 같은 기능이 필요한 경우
, 당신은 단순히 as_tie
을 작성할 수 있습니다
struct SomeType {
int Number;
std::string Chicken;
auto as_tie() { return std::tie(Number, Chicken); }
auto as_tie() const { return std::tie(Number, Chicken); }
};
지금 당신이
someInstance.as_tie()
를 입력하여 참조의
tuple
로
SomeType
에 액세스 할 수 있습니다.
이것은 여전히 무료로 <
또는 ==
등을주지는 못합니다. 우리는 한 장소에서 그렇게하고 as_tie
기술을 사용하는 모든 곳을 다시 사용할 수 있습니다 : 우리를 제공
struct as_tie_ordering {
template<class T>
using enable = std::enable_if_t< std::is_base_of<as_tie_ordering, std::decay_t<T>>, int>;
template<class T, enable<T> =0>
friend bool operator==(T const& lhs, T const& rhs) {
return lhs.as_tie() == rhs.as_tie();
}
template<class T, enable<T> =0>
friend bool operator!=(T const& lhs, T const& rhs) {
return lhs.as_tie() != rhs.as_tie();
}
template<class T, enable<T> =0>
friend bool operator<(T const& lhs, T const& rhs) {
return lhs.as_tie() < rhs.as_tie();
}
template<class T, enable<T> =0>
friend bool operator<=(T const& lhs, T const& rhs) {
return lhs.as_tie() <= rhs.as_tie();
}
template<class T, enable<T> =0>
friend bool operator>=(T const& lhs, T const& rhs) {
return lhs.as_tie() >= rhs.as_tie();
}
template<class T, enable<T> =0>
friend bool operator>(T const& lhs, T const& rhs) {
return lhs.as_tie() > rhs.as_tie();
}
};
:
struct SomeType:as_tie_ordering {
int Number;
std::string Chicken;
auto as_tie() { return std::tie(Number, Chicken); }
auto as_tie() const { return std::tie(Number, Chicken); }
};
지금
SomeTime a,b;
bool same = (a==b);
작품. as_tie_ordering
은 CRTP를 사용하지 않으며 비어있는 상태 비 저장 클래스입니다. 이 기술은 Koenig lookup을 사용하여 인스턴스에서 연산자를 찾을 수있게합니다. 또한 구현할 수
가 작동 std::tuple_size
얻기 get
struct as_tie_get {
template<class T>
using enable = std::enable_if_t< std::is_base_of<as_tie_get, std::decay_t<T>>, int>;
template<std::size_t I, class T,
enable<T> =0
>
friend decltype(auto) get(T&& t) {
using std::get;
return get<I>(std::forward<T>(t).as_tie());
}
};
을 ADL 기반은 슬프게도, 쉽지 않다.
위의 enable<T> =0
절은 MSVC에서 class=enable<T>
으로 대체해야합니다. 컴파일러는 C++ 11을 준수하지 않기 때문입니다.
내가 위에 언급 한 내용은 tuple
입니다. 하지만 일반적으로 을 사용하고 있습니다. 내 타입을 튜플로 변환 한 다음 튜플의 <
을 사용하여 <
을 작성한다. 그 글루 코드는 묶음을 일반적인 유형의 묶음으로 취급합니다. 그것이 tuple
을위한 것입니다.
"_using 키워드 만 사용하여이 문제를 해결할 수있는 방법은 무엇입니까?" No. – cpplearner
'C++ 11','C++ 14','C++ 1z'를 동시에 사용할 수 없습니다. – Inline
이 변경 사항보다 제안이 있습니까? –