Макрос C ++ для преобразования строки в список символов - PullRequest
4 голосов
/ 31 мая 2011

Возможно ли иметь макрос, чтобы иметь:

CHAR_LIST (курица)

расширить до:

'c', 'h', 'i', 'c', 'k', 'e', ​​'n'

[Причина, по которой я этого хочу: потому что даже для строк среднего размера макрос намного удобнее, чем расширение вручную. И причина, по которой мне нужно расширить, заключается в передаче строки в шаблон varidiac]

Ответы [ 2 ]

3 голосов
/ 31 мая 2011

Обновление от автора, июль 2015 года. Из-за комментариев, приведенных выше по самому вопросу, мы видим, что реальный вопрос был не о макросах как таковых.Реальная проблема, которую хотел решить спрашивающий, состояла в том, чтобы иметь возможность передавать литеральную строку в шаблон, который принимает серию символов в качестве не типовых аргументов шаблона.Вот демоверсия ideone решения этой проблемы.Реализация там требует C ++ 14, но его легко конвертировать в C ++ 11.

------------

Я думаюнам нужен более четкий пример того, как этот макрос будет использоваться.Нам нужен пример шаблона variadic.(Другое Обновление : это не будет работать не работает для меня на g ++ 4.3.3 в шаблоне с переменными параметрами, даже когда включена поддержка c ++ 0x, но я думаю,это может быть интересно в любом случае.)

#include<iostream> // /8057501/makros-c-dlya-preobrazovaniya-stroki-v-spisok-simvolov
#include "stdio.h"

using namespace std;

#define TO_STRING(x) #x
#define CHAR_LIST_7(x)   TO_STRING(x)[0] \
                       , TO_STRING(x)[1] \
                       , TO_STRING(x)[2] \
                       , TO_STRING(x)[3] \
                       , TO_STRING(x)[4] \
                       , TO_STRING(x)[5] \
                       , TO_STRING(x)[6] \

int main() {
        cout << TO_STRING(chicken) << endl;
        printf("%c%c%c%c%c%c%c", CHAR_LIST_7(chicken));
}

Строка, определяющая d, - это то, что вас интересует. Я включил другие примеры, чтобы показать, как он построен.Меня интересует ссылка @ GMan для автоматизации процесса подсчета.

2 голосов
/ 31 мая 2011

Нет, извините, не может быть сделано.Там нет операции для разделения строки на символы.Самое близкое, что вы можете получить, - это рекурсивное метапрограммирование, но это даст вам массив как объект, а не фактическое текстовое представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...