Разверните шаблон variadi c до массива элементов stati c - PullRequest
0 голосов
/ 03 апреля 2020

Я определил шаблон базового класса:

template<class actual_class>
class base
{
public:
    static const int value;
}

, а определение value зависит от actual_class tparam.

Далее у меня есть набор производных классы из base, назовем их a и b. Давайте также скажем, что a::value = 5 и b::value = 10.

Теперь в шаблоне метода, где мне нужно получить доступ к значениям stati c из пакета параметров. Я бы хотел, чтобы они были в векторе.

template<class... derived_from_bases>
void foo(irrelevant_class<derived_from_bases...> irrelevant)
{
    // std::vector<int> values = { ... }
    ...
}

Для функции, вызываемой с помощью tparams, я бы хотел, чтобы вектор значений выглядел так:

std::vector<int> values = {5 /* a::value */, 10 /* b::value */};

Также было бы неплохо иметь std :: array вместо std :: vector.

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 03 апреля 2020

Для вектора вам просто нужно

std::vector<int> values = { derived_from_bases::value... };

Если у вас есть C ++ 17, вы можете получить std::array так же, как

std::array values = { derived_from_bases::value... };

и CTAD определит тип и размер массива для вас. Если у вас нет C ++ 17, тогда вы можете использовать

std::array<int, sizeof...(derived_from_bases)> values = { derived_from_bases::value... };
...