Одной из основных проблем вашего интерфейса является то, что единственный конструктор T
занимает const U&
. Это означает, что вы можете передать временное значение в T
и оставить reference_wrapper
для мертвого объекта, поскольку const&
в объекте не продлевает время жизни временного объекта.
Чтобы решить эту проблему, вам нужно добавить удаленный конструктор, который останавливает вас от принятия временных. Добавление
T(const U&&) = delete;
сделает это.
Наличие нескольких языков в одном проекте на самом деле довольно распространено, однако принципы позади не всегда просты.
В простом случае, различные языки компилируются в тот же код. Например, C и код C++ обычно компилируется в ассемблер машины или C#, и VB.Net компилируется в IL (язык, понятый под временем выполнения.NET).
Это становится более трудным, если языки/компиляторы используют differnt систему типов. Может быть много различных путей, типы основных данных, такие как целое число, плавать и удваиваются, представлены внутренне, и существует еще больше способов представить строки. При раздавании типов между различными языками это должно быть уверено, что обе стороны интерпретируют тип то же или - если не - типы правильно отображаются. Этот вид отображения типа также известен как маршалинг .
Классические примеры совместимости между различными языками программы (главным образом от мира Windows):
Обычно любой прилично размерный веб-проект будет использовать приблизительно пять языков: HTML, CSS, JavaScript, некоторая серверная сторона “getting вещи done” язык (ASP, JSP, сценарии CGI с Perl, PHP, и т.д.), и некоторый вариант SQL для возможности соединения базы данных.
(Это - конечно, отмахивание руки аргумент о том, являются ли HTML и количество CSS как языки программирования †“I’m “they, но просто не полный по Тьюрингу languages” лагерь, но that’s целый другой поток.)
Некоторые примеры того, как все они сотрудничают:
, Если you’re, идущий путем лучших практик, структура веб-страницы находится в HTML и инструкциях для того, как отобразиться, это находится в CSS †“, который мог быть в том же файле, но don’t должны быть. CSS содержит набор классов, которые HTML посылает к, и it’s до браузера выяснить, как нажать их вместе.
Взятие всего, что шаг вперед, любые сценарии JavaScript на той странице могут изменить любой HTML/CSS, который присутствует (содержание изменения объектов HTML, выгрузите один класс CSS для другого, измените поведение CSS и так далее.) Это делает это через что-то позвонившее Объектная модель документа, которая является по существу языком и платформенно независимым API для управления страницами HTML подобным объекту способом (в которой точке I’ll отступают медленно и просто предоставляют ссылку на соответствующая статья Wiki.)
, Но тогда, где делает весь HTML / CSS / JavaScript прибывает из? That’s, что делает язык серверной стороны. В самой простой форме язык serer-стороны является программой, которая возвращает гигантскую строку, содержащую страницу HTML как ее вывод. Это, очевидно, может стать намного более сложным: HTML-формы и параметры строки запроса могут использоваться в качестве входа для нашей серверной программы, и затем у Вас есть целая вещь Ajax, где JavaScript добирается для отправки данных непосредственно в язык сервера также. Можно также стать необычными, где язык сервера может настроить HTML, CSS и JavaScript, который выводит слюну †“по существу, у Вас есть программа в одном языке, пишущий программу в другом языке.
язык Серверной стороны к почти таким же работам соединения SQL. Существует много способов сделать его и более сложным и более безопасным, но самый простой путь состоит в том, чтобы Ваш язык сервера динамично создал строку с командой SQL в нем, вручите это базе данных через некоторый коннектор и возвратите набор результатов. (Это - случай, где у Вас действительно есть функция, которая сводится к someValue = database.executeThisSQLCommand (SQLString).)
Так для оборачивания этого различные языки в этом случае или связываются путем фактической записи программ друг в друге, или путем раздавания данных в очень простом, легком проанализировать форматы, которые все могут понять. (Строки, главным образом.)
Несколько используемых языков называют "совместимостью" или "interop", если коротко.
Ваш пример является неправильным. Java может вызвать функции C.
язык обеспечивает механизм для совместимости.
В случае.NET, языки компилируются в IL как часть CLI. Таким образом любой язык.NET может interop (назвать методы определенными) модули определенный на любом другом языке.NET.
Как пример:
я могу определить метод в C#
static void Hello(){ Console.WriteLine("Hello World");}
, И я могу назвать его из Python (IronPython)
Hello()
И получить ожидаемый вывод.
Вообще говоря, некоторые языки interop лучше, чем другие, особенно если авторы языка конкретно сделали interop функцией языка.
Несколько языков могут взаимодействовать с:
почти в каждом случае, необходимо преобразовать любую коммуникацию в распространенный формат, прежде чем этим можно будет обменяться (исключением являются языки на том же времени выполнения). Поэтому несколько языков редко используются в одном проекте.
Я работаю над проектом крупного предприятия, который состоит (в последнем количестве) приблизительно из 8 языков. Большинство коммуникации через шину сообщения уровня предприятия, которая содержит привязку для нескольких языков, чтобы насладиться и передать данные назад и вперед. Это звонило tibco.
У Вас могло быть приложение, где объем работы сделан в Java, но могла бы быть некоторая часть его, как, возможно, синтаксический анализатор данных, или что-то записано в Python или что имеет Вас. Почти два отдельных приложения действительно, возможно, синтаксический анализатор просто делает некоторую работу над файлами, и затем Ваше главное приложение в Java использует их для чего-то. Если бы кто-то должен был спросить меня, что я использовал в этом проекте, то я сказал бы "Java и Python".
Существует много differnt способов, которыми можно использовать differnt языки в одном проекте существует две основных категории, которые приходят на ум
Существуют различные способы, которыми несколько языков могут использоваться в одном проекте. Некоторые примеры:
Это зависит от типа проекта. Если Вы хотите экспериментировать, можно настроить веб-проект, в.NET, и изменить язык на постранично основание. Это не работает, поскольку Вы показываете в своем псевдокоде, но это - несколько языков. Конечно, фактический каталог кода должен быть единственным языком.
Существует несколько путей, которыми код на языках может взаимодействовать непосредственно. Пока данные, передаваемые между кодом, находятся в правильном формате на уровне битов и байтов, тогда нет никакой причины, почему различные языки не могут interop. Этот подход используется в традиционной разработке окон DLL. Даже на различных платформах, если можно получить корректный формат (взгляд на большой/с прямым порядком байтов, если заинтересовано) он будет работать, пока компоновщик (не компилятор) знает, как присоединиться к коду вместе.
Кроме того существуют многочисленные другие пути, которыми языки могут говорить друг с другом. В .NET мировой код компилируется вниз в код IL, который является тем же для каждого языка, таким образом C#, VB.Net все равно находятся под капотом и могут называть/работать друг с другом беспрепятственно.
Плохо. Если нет никакой насущной необходимости, придерживайтесь единственного языка. Вы увеличиваете зависимости и сложность. Но когда у Вас есть существующий код, обеспечивающий интересную функциональность, может быть легче склеить его, чем воссоздать его.
Только для добавления к списку примеров довольно распространено оптимизировать код Python в C или C++ или записать библиотеку C для привязки другой библиотеки с Python.