Сначала создайте черту для проверки специализаций. array
и span
выглядят одинаково в том смысле, что они принимают параметр типа и параметр нетипичного типа:
template <typename T, template <typename, auto> class Z>
struct is_specialization : std::false_type { };
template <typename A, auto V, template <typename, auto> class Z>
struct is_specialization<Z<A,V>, Z> : std::true_type { };
template <typename T, template <typename, auto> class Z>
inline constexpr bool is_specialization_v = is_specialization<T, Z>::value;
И затем мы можем построить концепцию из этого:
[ 111]Который вы бы использовали следующим образом:
template <typename Element, std::ptrdiff_t Extent = -1>
struct span {
template <typename C> requires AllowedContainer<C, Element>
span(C&);
template <typename C> requires AllowedContainer<C const, Element>
span(C const&);
};
Требование к const
-мости не позволяет использовать хороший синтаксис частичного-концепта-идентификатора , но мы могли бы просто добавьте еще одну концепцию для этого:
template <typename T, typename E>
concept ConstAllowedContainer = AllowedContainer<T const, E>;
template <typename Element, std::ptrdiff_t Extent = -1>
struct span {
template <AllowedContainer<E> C> span(C&);
template <ConstAllowedContainer<E> C> span(C const&);
};
Не уверен, что здесь есть более умный подход.
Но на самом деле вся эта пара конструкторов, вероятно, является ошибкой, и вы хотите сделать ссылку на пересылку:
template <typename Element, std::ptrdiff_t Extent = -1>
struct span {
template <AllowedContainer<E> C>
span(C&&);
};
Этот последний подход требует нескольких настроек для концепция (все remove_cv_t
должны стать remove_cvref_t
).
про / недостатки:
СБРОС:
LLVM:
C как выходной язык:
Байт-код Java как цель:
От всего вышеупомянутого я думаю, будучи нацелен на байт-код Java, вероятно, было бы лучшим для Вас.
Править: на самом деле ответ на комментарий, но 300chars недостаточно.
Сомнительный JByteCode - я соглашаюсь (быть Smalltalker, JBytecode также ограничивает для меня).
VM-wise, я думаю, что существует относительно широкий спектр производительности, которую можно получить как JVM, запускающаяся в чистых медленных интерпретаторах байт-кода до сложного JITting VMs высокого класса (IBM). Я предполагаю, VM's CLR нагонит, поскольку MS крадет и интегрирует все инновации так или иначе рано или поздно и методы к ускорению, динамический перевод публикуется (читает Сам бумаги, например). LLVM будет, вероятно, прогрессировать немного медленнее, но кто знает. С C Вы извлечете выгоду из лучших компиляторов бесплатно, но вещи как динамический переперевод и т.д. трудно реализовать с C как цель. Моя собственная система использует смесь предварительно скомпилированного и динамично скомпилированного кода (имеющий все: медленный интерпретатор байт-кода, Дрожание и предварительно скомпилированный статический C-код в одном пространстве памяти).
LLVM кажется обещанием. Команда требует лучших действий во время выполнения на gcc с их бэкендом по сравнению с собственным компонентом. Способность скомпилировать от AST действительно интересна (смотрите на учебное руководство). Это может скомпилировать и оптимизировать во времени выполнения, которое является необходимостью для динамического. Это может также работать как чистый интерпретатор.
Я рассматриваю использование LLVM в проекте, который включает создание подобного Tcl языка. Tcl является в большой степени динамичным, таким образом, я не знаю то, что это подразумевает на данном этапе, но я уверен, что получу лучшие действия, чем текущее основанное на байт-коде ядро.
Генерация кода является моим бизнесом :-)
Комментарии к нескольким опциям:
СБРОС:
LLVM:
C как выходной язык
Сводка: что-либо кроме C - разумный выбор. Для лучшей комбинации гибкости, качества и ожидаемой долговечности, я, вероятно, рекомендовал бы LLVM.
Полное раскрытие: Я аффилирован с C - проект.