0

コンテナを扱っています。

Aがコンテナの場合はcontainer_traits<A>::reference_containerA.

コンテナがRefContainer<C>is_base_ofAの場合、 a とcontainer_traits<A>::reference_container入力する必要がありCます。

次のコードは、このアップキャスト (または、私が言うように、逆参照) を行います。問題は、reference = falseコンパイラが型として存在するかどうかをチェックしてもC::reference_container、コンパイルに失敗することです。

他のアプローチはありますか?

#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;
}
4

1 に答える 1

1

ヘルパークラスを作成するだけ

template<class T, bool der>
struct hlp
{
   typedef T type;
}

template<class T>
struct hlp<RefContainer<T>, true>
{
   typedef T::reference_container type;
}
于 2013-03-27T11:41:21.313 に答える