Я работаю над некоторым библиотечным кодом и хочу, чтобы пользователи могли воспользоваться статической привязкой, если они могут. Если они не могут создать экземпляр класса во время компиляции, я хочу, чтобы была динамическая версия класса, чтобы его можно было создать во время выполнения.
Для быстрого примера предположим, что у меня есть шаблон структуры 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 статически и динамически:
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<true>(5);
? - person dyp   schedule 12.11.2014constexpr
, вероятно, является ключом к тому, чтобы обойти проблему. Возможно, вам даже не понадобится делатьA
шаблон. - person MSalters   schedule 12.11.2014