[英]Using static functions of a base class without specifying parameters to avoid ambiguity
我的一些基类获得了大量的参数。 现在我想指定要使用的静态函数:
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;
};
您可以看到,我需要两次编写模板参数,这会导致代码重复。
有没有办法摆脱它?
你可以使用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;
};
如果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, "");
使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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.