Мне нужен общий способ создания экземпляра любого типа. нуждается Эта задача должна быть выполнена из не-шаблонного объекта, и поэтому я в настоящее время с помощью интерфейса, например так:Конструктор Аргумент переадресации через интерфейс
class Interface
{
public:
virtual void PlacementCopy(void *data, const void *src) const = 0;
virtual void PlacementNew(void *data) const = 0;
virtual void PlacementDelete(void *data) const = 0;
virtual void Delete(void *data) const = 0;
virtual void Copy(void *dest, const void *src) const = 0;
virtual void NewCopy(void **dest, const void *src) const = 0;
virtual void *New() const = 0;
};
Это все, кроме системы пользовательского отражения, и поэтому он используется, как это:
int *p = META(int)->Interface->New();
*p = 10;
Это работает путем создания шаблонного объекта, который является производным от Interface
, который содержит тип будет построена. New
оператор в интерфейсе делает конструкцию по умолчанию типа:
template <typename T>
class Derived : public Interface
{
virtual void *New(void) const override
{
return new T();
}
};
Проблема: Все типы, которые должны быть сконструированы таким образом, должен обеспечить конструктор по умолчанию. Я хотел бы как-то разрешить произвольные аргументы передаваться конструктору рассматриваемого типа.
мне как-то нужно, чтобы быть в состоянии сделать:
MetaInfo *meta = META(SomeType);
SomeType *object = meta->New(arg1, arg2);
Что бы возможно искать что-то подобное в реализации:
template <typename T>
Derived : public Interface
{
template <typename ... Args>
virtual void *New(Args&& ... args) const override
{
new T(std::forward<Args>(args) ...);
}
};
Объект MetaInfo
не шаблонный тип, который затрудняет придумайте решение для переадресации аргументов. Я не могу просто templatize метод New
в классе Derived
, так как вы не можете templatize виртуальный метод.
Является ли то, что я прошу даже без предварительной сумасшедшей предварительной обработки кода?
Вы можете использовать генератор кода или препроцессор (скорее всего [Boost.Preprocessor] (http://www.boost.org/doc/ libs/1_53_0/libs/preprocessor/doc/index.html)) для создания безумного количества перегрузок для разных чисел и типов аргументов. – Angew
Ха-ха, я бы предпочел не делать предварительную обработку кода, если это возможно. Не большой поклонник добавления шагов до сборки, если их можно избежать. Это усложняет процесс сборки и добавляет потенциал для непредвиденного обслуживания кода. – RandyGaul
Что вы ожидаете, если ваш метаобъект описывает класс с одним конструктором, принимающим один аргумент 'int', а кто-то называет' meta-> New («thank you», 42.0) '? Должна ли быть ошибка времени компиляции, ошибка времени выполнения или что? –