Как передать строку без кавычек для работы?

template<typename... Args>
void callJavaScript(const Args&... args) {
     // TO-DO
}

callJavaScript({
   console.info("Hello World")
})

Можно ли сделать что-то подобное с помощью шаблонов Variadic (с/без взлома макросов)?

Вместо

callJavaScript("{
   console.info('Hello World')
}")

Я хочу

callJavaScript({
   console.info("Hello World")
})

Вот пример, который я нашел, который использует макросы,

#define MULTI_LINE_STRING(a) #a
const char *text = MULTI_LINE_STRING(
  Using this trick(,) you don't need to use quotes.
  Though newlines and     multiple     white   spaces
  will be replaced by a single whitespace.
);

Вот моя версия этого макроса,

#define createScript(name, ...)                 \
const char *name = #__VA_ARGS__;

Я имею в виду, конечно, нет?

Peter 20.12.2020 21:39

Сами кавычки передаваться не будут, так как с этим уже все в порядке!

Klaus 20.12.2020 21:40

@Peter Компилятор жалуется на использование необъявленного идентификатора.

jeffbRTC 20.12.2020 21:41

@Peter Питер, интересно, есть ли специальный трюк для лязга, который может обойти это?

jeffbRTC 20.12.2020 21:42

@Peter Я видел библиотеку JSON (не помню название), которая делала это со своим собственным синтаксисом.

jeffbRTC 20.12.2020 21:42

Что именно вы подразумеваете под "без кавычек"? Можете ли вы показать пример, где вы используете аргумент?

cigien 20.12.2020 21:43

@cigien Пожалуйста, посмотрите мое редактирование. Я выделил часть.

jeffbRTC 20.12.2020 21:48

Извините, мне совсем не ясно, чего вы хотите добиться. Пожалуйста, сделайте минимально воспроизводимый пример и точно опишите, что вы хотите, чтобы произошло по-другому.

cigien 20.12.2020 21:51

@cigien Точно, у меня есть интерпретатор JS, который принимает код в виде строки, и для передачи кода мне приходится заключать код в кавычки. Мне нужно избегать этого из-за побега от беспорядка. Итак, я подумал, что вариативные шаблоны или макросы могут помочь в этом. Вопрос ищет ответ о возможности.

jeffbRTC 20.12.2020 21:54

Совершенно непонятно, ЗАЧЕМ вам это нужно! В C++ строки заключаются в кавычки " и никак иначе. Чего вы действительно хотите достичь? Не имею представления!

Klaus 20.12.2020 21:56

@Klaus Потому что это позволяет свободно печатать без экранирования.

jeffbRTC 20.12.2020 21:58

Я не думаю, что то, чего вы хотите достичь, может быть достигнуто на С++. Вероятно, может в Lisp, у которого на самом деле есть мощные макросы, в отличие от препроцессора макросов подстановки токенов C++ или шаблонов C++ (более мощные, чем макросы C++, но не такие мощные, как макросы Lisp). Или на языке сценариев, таком как Lua, Python или JavaScript. Но не С++.

Eljay 20.12.2020 22:05

@Eljay Eljay Я имею в виду, что вы можете сделать что-то вроде макроса, но можно ли сделать то же самое с шаблонами? #define createScript(name, ...) \ const char *name = #__VA_ARGS__;

jeffbRTC 20.12.2020 22:26

@Eljay Макрос компилируется нормально. и распечатать сценарий.

jeffbRTC 20.12.2020 22:26

«свободный ввод без экранирования» Вы можете получить это без макросов. Используйте так называемые необработанные строки. callJavaScript(R"({console.info("Hello World")})").

HolyBlackCat 20.12.2020 22:29

@Eljay Eljay Я нашел ответ и сам ответил на него. Теперь это возможно на 100%.

jeffbRTC 20.12.2020 22:47
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
5
16
217
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Отвечая на мой собственный вопрос.

void callJavaScript(std::string script) {

    std::cout << script << "\n";
}

#define callJavaScript(...) callJavaScript(#__VA_ARGS__)

Теперь вы можете вызвать так,

callJavaScript({
   console.info("Hello World")
})

Вы можете скомпилировать это, тогда он выведет

{console.info("Hello World")}

Если у кого-то есть лучший способ с шаблонами, пожалуйста, сообщите.

Другие вопросы по теме