Шаблоны C++, которые принимают только определенные типы

В настоящее время все вызовы API используют сообщение axios post для http: // localhost: 4000 / , что, как я предполагаю, также не будет работать на сервере.

blockquote>

Вы правы, это не сработает. Это потому, что если пользователи получат ваше приложение React , все вызовы API будут перенаправлены на их localhost . Который не поддерживает ваш API

Когда я пытаюсь запустить его из службы хостинга так же, как я делал ранее, он говорит, что не может подключиться к базе данных, что Я полагаю, это связано с тем, что на моей машине соединение не открыто.

blockquote>

Это, вероятно, потому что URL MongoDB, вероятно, все еще имеет значение, похожее на 'mongodb://localhost:27017/myapp. Здесь есть 2 основных варианта.

  1. Воспользуйтесь «услугой размещения базы данных» , например MongoDB Atlas , затем вам потребуется изменить URL-адрес вашей базы данных, чтобы он указывал на предоставленный службой
  2. Разместите базу данных на своем сервере , которая будет работать с localhost URL

Я искал в Интернете информацию о развертывание стека MERN, но все, что я нашел, обсуждают его с точки зрения хостинга на AWS EC2, а это не то, чем я буду заниматься.

blockquote>
  • Любой сервер, на котором у вас есть контроль и гибкость , будет работать в этом сценарии. Вы можете разместить все свои вещи (сервер, интерфейс и базу данных) на нем, если хотите. EC2 может делать все это , но это не единственный вариант. Вы также можете проверить аналогичные продукты от Microsoft и Google, и т.д ...
  • Другим способом является развертывание каждого артефакта отдельно , который является более масштабируемым, но также имеет свою сложность. Если вы идете таким образом, вы можете рассмотреть Docker контейнеры и Kubernetes , которые полезны для организации распределенных систем
[119 ] Редактировать

Поскольку вы используете MongoDB Atlas, убедитесь, что вы занесли в белый список IP-адрес вашего сервера

144
задан mgamer 17 May 2009 в 10:16
поделиться

6 ответов

Я предлагаю использовать функцию Boost static assert вместе с is_base_of из библиотеки свойств типа Boost:

template<typename T>
class ObservableList {
    BOOST_STATIC_ASSERT((is_base_of<List, T>::value)); //Yes, the double parentheses are needed, otherwise the comma will be seen as macro argument separator
    ...
};

В некоторых других, более простых случаях, вы можете просто объявить глобальный шаблон вперед-объявить, но определить (явно или частично) его только для допустимых типов:

template<typename T> class my_template;     // Declare, but don't define

// int is a valid type
template<> class my_template<int> {
    ...
};

// All pointer types are valid
template<typename T> class my_template<T*> {
    ...
};

// All other types are invalid, and will cause linker error messages.

[Незначительное РЕДАКТИРОВАНИЕ 6/12/2013: Использование объявленного, но не определенного шаблона приведет к компоновщику , а не компилятору, сообщения об ошибках.]

102
ответ дан 23 November 2019 в 22:52
поделиться

Это невозможно в простом C ++, но вы можете проверить параметры шаблона во время компиляции с помощью проверки концепции, например, используя BCCL Boost .

5
ответ дан 23 November 2019 в 22:52
поделиться

Насколько мне известно, в настоящее время это невозможно в C ++. Однако есть планы добавить в новый стандарт C ++ 0x функцию, называемую «концепциями», которая обеспечивает нужную вам функциональность. Эта статья в Википедии о концепциях C ++ объяснит это более подробно.

Я знаю, что это не решает вашу непосредственную проблему, но есть некоторые компиляторы C ++, которые уже начали добавлять функции из нового стандарта, поэтому, возможно, удастся найти компилятор, который уже реализовал функцию концепций.

13
ответ дан 23 November 2019 в 22:52
поделиться

Есть ли какой-нибудь простой эквивалент этого ключевого слова в C ++?

Нет.

В зависимости от того, что вы пытаетесь выполнить, могут быть адекватные (или даже лучшие) замены.

I Я просмотрел некоторый код STL (в Linux, я думаю, это тот, который происходит от реализации SGI). В нем есть «концептуальные утверждения»; например, если вам требуется тип, который понимает * x и ++ x , утверждение концепции будет содержать этот код в функции ничего не делать (или что-то подобное). Это действительно требует некоторых накладных расходов, поэтому было бы разумно поместить его в макрос, определение которого зависит от #ifdef debug .

Если вы действительно хотите знать о взаимосвязи подклассов, вы можете утверждать в конструкторе, что T instanceof list (за исключением того, что в C ++ он "пишется" по-другому). Таким образом, вы можете проверить свой выход из компилятора, не имея возможности проверить это за вас.

1
ответ дан 23 November 2019 в 22:52
поделиться

Простое решение, о котором еще никто не упомянул, - просто игнорировать проблему. Если я попытаюсь использовать int в качестве типа шаблона в шаблоне функции, который ожидает контейнерный класс, такой как вектор или список, то я получу ошибку компиляции. Грубо и просто, но решает проблему. Компилятор попытается использовать указанный вами тип, и если это не удастся, он выдаст ошибку компиляции.

Единственная проблема с этим состоит в том, что сообщения об ошибках, которые вы получаете, будет сложно читать. Тем не менее, это очень распространенный способ сделать это. Стандартная библиотека полна шаблонов функций или классов, которые ожидают определенного поведения от типа шаблона и ничего не делают для проверки допустимости используемых типов.

Если вам нужны более удобные сообщения об ошибках (или если вы хотите отловить случаи, которые не приводят к ошибке компилятора,

58
ответ дан 23 November 2019 в 22:52
поделиться

Что ж, вы можете создать свой шаблон примерно так:

template<typename T>
class ObservableList {
  std::list<T> contained_data;
};

Это, однако, сделает ограничение неявным, плюс вы не сможете просто предоставить что-либо, похожее на список. Существуют и другие способы ограничения используемых типов контейнеров, например, путем использования определенных типов итераторов, которые существуют не во всех контейнерах, но опять же, это скорее неявное, чем явное ограничение.

Насколько мне известно, конструкция который полностью отражал бы оператор Java, не существует в текущем стандарте.

Есть способы ограничить типы, которые вы можете использовать в шаблоне, который вы пишете, используя определенные typedef внутри вашего шаблона. Это гарантирует, что компиляция специализации шаблона для типа, который не включает этот конкретный typedef, завершится ошибкой,

-2
ответ дан 23 November 2019 в 22:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: