0
컨테이너 작업.템플릿을 사용한 재귀 유형 상향 교환
A
이 컨테이너 인 경우 container_traits<A>::reference_container
은 A
이어야합니다.
RefContainer<C>
is_base_of A
인 경우 container_traits<A>::reference_container
은 C
이어야합니다.
다음 코드는이 상영 (또는 내가 말한 것처럼 역 참조)을 수행합니다. 이있는 경우 reference = false
컴파일러가 형식을 확인하고 컴파일하지 못하는 경우에도 문제가 발생합니다.
다른 접근 방법이 있습니까?
#include <iostream>
using namespace std;
template<typename C> struct RefContainer;
template<class C>
class container_traits
{
template <typename R>
static std::true_type ref_helper(const RefContainer<R>&);
static std::false_type ref_helper(...);
public:
constexpr static bool reference = decltype(ref_helper(std::declval<C>()))::value;
typedef typename std::conditional<reference, typename C::reference_container, C>::type reference_container;
};
template<typename C>
struct RefContainer : public C { typedef typename container_traits<C>::reference_container reference_container; };
struct Container1 {};
struct Container2 {};
template<typename C> struct D : public RefContainer<C> {};
struct E : public RefContainer<D<RefContainer<Container1>>> {};
int main()
{
container_traits<Container1>::reference_container e; // It is Container1
container_traits<RefContainer<Container1>>::reference_container f; // dereference to Container1
container_traits<D<Container2>>::reference_container // dereference to Container2
container_traits<E>::reference_container h; // dereference to Container1
return 0;
}
마지막 2 개 라인을 만드는()이 container1에 도착하지 못했습니다. 이 방법을 사용하면 RefContainer에서 파생 된 클래스가 아니라 RefContainer 만 잡을 수 있기 때문입니다. – Chameleon
@Chameleon이 놓친이 대답을 바 꾸었습니다. std :: conditional 대신 사용하십시오. – kassak