Использование статических функций базового класса без указания параметров, чтобы избежать двусмысленности

Некоторые из моих базовых классов получают тонны параметров. Теперь я хочу указать, какую статическую функцию использовать:

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

Итак, вы можете видеть, мне нужно написать параметры шаблона дважды, что приводит к дублированию кода.

Есть ли способ избавиться от этого?

5

Решение

Вы можете использовать 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;
};
3

Другие решения

Если 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, "");
1

Делать 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();
}
0
По вопросам рекламы [email protected]