5

私の基本クラスのいくつかは、大量のパラメーターを取得します。次に、使用する静的関数を指定します。

template <typename... Types>
struct SBase {
    static void func() {
    }
};

struct A : public SBase<int> {
};

struct B : public A, public SBase<int, double, short,
    unsigned int, float, unsigned char, long, unsigned long> {

    // using SBase::func; // Not possible.
    // Horrible, but works.
    using SBase<int, double, short,
    unsigned int, float, unsigned char, long, unsigned long>::func;
};

ご覧のとおり、テンプレートパラメータを2回記述する必要があるため、コードが重複します。

それを取り除く方法はありますか?

4

3 に答える 3

3

typedefを使用できます:

typedef SBase<int, double, short, unsigned int, float, unsigned char,
      long, unsigned long> B_SBase;

struct B : public A, public B_SBase {
    using B_SBase::func;
};
于 2012-11-24T13:34:20.067 に答える
1

Bがすでにテンプレートである場合(私のコードではほとんどの場合)、次のようにsthを使用できます。

template <typename MyBase = SBase<int, double, short,
                                  unsigned int, float, unsigned char,
                                  long, unsigned long> >
struct B : public A, public MyBase {
  using MyBase::func;
};

ただし、そうでない場合は、基本クラスを繰り返さないことや、名前空間を。で汚染しないことを認識している可能性はありませんtypedef SBase<...> Bs_Base。しかし、あなたが賢いなら、あなたはそれを二度書く必要があります:

struct B : public A, public SBase<int, double, short,
    unsigned int, float, unsigned char, long, unsigned long> {
  typedef SBase<int, double, short, unsigned int, float,
                unsigned char, long, unsigned long> MyBase;
};
static_assert(std::is_base_of<B::MyBase, B>::value, "");
于 2012-11-24T13:39:32.847 に答える
0

クラスBテンプレートを作成します。そこには、繰り返しはありません:

template<typename... Types>
struct B : public A, public SBase<Types...> {
  using SBase<Types...>::func;
};

typedef B<int, double, short, unsigned int, float, unsigned char, long, unsigned long> BB;

void foo ()
{
  BB::func();
}
于 2012-11-24T13:33:02.220 に答える