Я работаю над некоторым кодом библиотеки, и я хочу, чтобы пользователи могли использовать статические привязки, если они в состоянии. Если они не могут создать экземпляр класса во время компиляции, я хочу, чтобы там была динамическая версия класса, чтобы он мог быть создан во время выполнения.Есть ли шаблон, который может генерировать статические/динамически связанные версии класса?
Для быстрого примера, скажем, у меня есть шаблон структуры A:
template<bool dynamic, int value=0> struct A
{
static const int Value = value;
};
template<> struct A<true>
{
int Value;
A(int value) : Value(value) {}
};
Эти определения позволяет пользователям библиотеки для создания экземпляра статически и динамически:
A<true> dynamicA = A<true>(5);
A<false, 5> staticA;
Проблема с этим метод заключается в том, что я должен написать определение класса дважды. Я могу придумать несколько способов реализации шаблона, который будет генерировать обе версии самостоятельно, но я вижу, что это становится большой работой. Специально для классов, которые будут использовать различное число параметров, например:
// It would be much harder to generate a static version of this class,
// though it is possible with type lists. Also, the way I'm imagining it,
// the resulting classes probably wouldn't be very easy to use.
struct A
{
vector<int> Values;
A(vector<int> value) : Values(value) {}
};
Есть ли имя для этого шаблона/проблем? Есть ли библиотека метапрограмм, в которой есть шаблоны, которые могут генерировать для меня оба определения? Как мне избежать необходимости писать определения моих классов дважды?
Я не уверен, я понимаю, что вы имеете в виду с «статическим связыванием» в этом контексте; но что случилось с 'constexpr auto pseudostatic = A (5);'? –
dyp
Как вы обнаруживаете, создается ли какой-либо конкретный класс во время выполнения? – wowofbob
Даже если решение dyp не применимо напрямую, 'constexpr', вероятно, является ключом к уклону от проблемы. Возможно, вам даже не понадобится шаблон 'A'. – MSalters