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 Компилятор жалуется на использование необъявленного идентификатора.
@Peter Питер, интересно, есть ли специальный трюк для лязга, который может обойти это?
@Peter Я видел библиотеку JSON (не помню название), которая делала это со своим собственным синтаксисом.
Что именно вы подразумеваете под "без кавычек"? Можете ли вы показать пример, где вы используете аргумент?
@cigien Пожалуйста, посмотрите мое редактирование. Я выделил часть.
Извините, мне совсем не ясно, чего вы хотите добиться. Пожалуйста, сделайте минимально воспроизводимый пример и точно опишите, что вы хотите, чтобы произошло по-другому.
@cigien Точно, у меня есть интерпретатор JS, который принимает код в виде строки, и для передачи кода мне приходится заключать код в кавычки. Мне нужно избегать этого из-за побега от беспорядка. Итак, я подумал, что вариативные шаблоны или макросы могут помочь в этом. Вопрос ищет ответ о возможности.
Совершенно непонятно, ЗАЧЕМ вам это нужно! В C++ строки заключаются в кавычки " и никак иначе. Чего вы действительно хотите достичь? Не имею представления!
@Klaus Потому что это позволяет свободно печатать без экранирования.
Я не думаю, что то, чего вы хотите достичь, может быть достигнуто на С++. Вероятно, может в Lisp, у которого на самом деле есть мощные макросы, в отличие от препроцессора макросов подстановки токенов C++ или шаблонов C++ (более мощные, чем макросы C++, но не такие мощные, как макросы Lisp). Или на языке сценариев, таком как Lua, Python или JavaScript. Но не С++.
@Eljay Eljay Я имею в виду, что вы можете сделать что-то вроде макроса, но можно ли сделать то же самое с шаблонами? #define createScript(name, ...) \ const char *name = #__VA_ARGS__;
@Eljay Макрос компилируется нормально. и распечатать сценарий.
«свободный ввод без экранирования» Вы можете получить это без макросов. Используйте так называемые необработанные строки. callJavaScript(R"({console.info("Hello World")})").
@Eljay Eljay Я нашел ответ и сам ответил на него. Теперь это возможно на 100%.
Отвечая на мой собственный вопрос.
void callJavaScript(std::string script) {
std::cout << script << "\n";
}
#define callJavaScript(...) callJavaScript(#__VA_ARGS__)
Теперь вы можете вызвать так,
callJavaScript({
console.info("Hello World")
})
Вы можете скомпилировать это, тогда он выведет
{console.info("Hello World")}
Если у кого-то есть лучший способ с шаблонами, пожалуйста, сообщите.
Я имею в виду, конечно, нет?