класс — c ++ шаблоны политик с аргументами

Я новичок в этом. Я создаю класс с политикой сказать:

template <typename T,
typename P1 = Policy1<T>,
typename P2 = Policy2<T> >

{
...
}

У меня проблема в том, что некоторые политики имеют аргументы, и когда они находятся во время компиляции, все в порядке

template <typename T,
typename P1 = Policy1<T, size_t N>,
typename P2 = Policy2<T> >

но когда они выполняются во время выполнения, я не уверен, каков наилучший способ предоставить объект класса политики … или это уже не шаблон политики?

4

Решение

Вы можете иметь фабрику для политики 🙂 РЕДАКТИРОВАТЬ См добавлено ниже

Вы можете сделать так, как это делает стандартная библиотека:

#include <string>

struct DummyPolicy { };

template <typename>
struct Policy1 { Policy1(int, std::string) { } };

template <typename T,
typename P1 = Policy1<T> >
struct X
{
X(P1 p1 = {}) : _policy1(std::move(p1)) { }

private:
P1 _policy1;
};

И использовать это

int main()
{
X<int, DummyPolicy> no_questions_asked;
X<int> use_params({42, "hello world"});
}

С C ++ 03 или явными конструкторами, очевидно, это прописано:

     X<int> use_params(Policy1<int>(42, "hello world"));

Видеть это Жить на Колиру


Вот обновление, показывающее фабричный подход:

#include <string>

namespace details
{
template <typename PolicyImpl>
struct PolicyFactory
{
static PolicyImpl Create() {
return {};
}
};
}

template <typename>
struct Policy2 { Policy2(double) { } };

template <typename T,
typename P1 = Policy2<T> >
struct X
{
X()      : _policy1(details::PolicyFactory<P1>::Create()) {}
X(P1 p1) : _policy1(std::move(p1)) { }

private:
P1 _policy1;
};

///// supply a factor, possibly local to a TU:

namespace details
{
template <typename T>
struct PolicyFactory<Policy2<T> > {
static Policy2<T> Create() {
return Policy2<T>(3.14);
}
};
}

int main()
{
// with a factory:
X<std::string, Policy2<std::string> > no_params_because_of_factory;
}

Видеть это Жить на Колиру*

Обратите внимание, что

  • Я предпочитаю подход конструктора
  • Фабрика технически черта характера учебный класс
9

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

Политики в шаблонах предназначены для настройки класса во время компиляции, а не во время выполнения (политики формируют тип экземпляра, и вы не можете выбирать типы во время выполнения в C ++).

Параллель во время выполнения обычно называется «внедрением зависимости», и вы делаете это, например, путем передачи уже созданных объектов, которым экземпляр будет делегировать операции.

5

По вопросам рекламы [email protected]