使用基类的静态函数而不指定参数以避免歧义

时间:2012-11-24 13:20:15

标签: c++ c++11 class-template

我的一些基类获得了大量参数。现在我想指定使用哪个静态函数:

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

您还可以看到,我需要两次编写模板参数,这会导致代码重复。

有没有办法摆脱它?

3 个答案:

答案 0 :(得分: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;
};

答案 1 :(得分:1)

如果B已经是模板(在我的代码中大多是这种情况),那么你可以使用这样的:

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, "");

答案 2 :(得分: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();
}