3

私はこれを行うことができます:

template <class T>
struct foo {
    typedef T   type;
};

template <template <size_t> class B>
struct foo2 {
    typedef B<0>    type;
};

struct bar1 {};

template <size_t N = 1>
struct bar2 {};

// usage
foo<bar1>::type // ok, = bar1
foo<bar2<> >::type // ok, = bar2<1>
foo2<bar2>::type // ok, = bar2<0>

foo を部分的に特殊化して、特殊化されていないクラス引数 bar2 を受け入れることはできますか? お気に入り:

foo<bar2>::type  // should give me bar2<0>

以下のことを試しましたが、うまくいきません。

// compile error 
template <template <size_t> class B>
struct foo<B> {   
    typedef B<0>    type;
};
4

1 に答える 1

3

オーバーロードされたテンプレート関数を使用decltypeして、私はこれを思いついた:

#include <type_traits>  

struct bar;

template <size_t> struct baz;

template <typename T>
struct foo_type
{
  typedef T type;
};

template <template <size_t> class C>
struct foo_class_template
{
  typedef C<0> type;
};

template <typename T>
foo_type<T> doit();

template <template <size_t> class C>
foo_class_template<C> doit();

void stackoverflow()
{
  typedef decltype(doit<bar>()) Ret;
  static_assert(std::is_same<Ret::type, bar>::value, "oops");

  typedef decltype(doit<baz>()) Ret2;
  static_assert(std::is_same<Ret2::type, baz<0>>::value, "oops");
}

ただし、これを機能させるにはC++11のサポートが必要です。

于 2012-07-25T07:11:50.677 に答える