инициализация c-string с изменением инициализатора
От: niXman Ниоткуда https://github.com/niXman
Дата: 30.11.13 12:45
Оценка: :)
привет!

дано: "(std::vector<int>)"
нужно этим инициализировать constexpr указатель, но так, чтоб исключить первый и последний символы, т.е. скобки.

первый исключить легко: constexpr const char *str = "(std::vector<int>)"+1
но вот как избавиться от последнего символа?

спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: инициализация c-string с изменением инициализатора
От: watchmaker  
Дата: 30.11.13 13:18
Оценка:
Здравствуйте, niXman, Вы писали:

X>первый исключить легко: constexpr const char *str = "(std::vector<int>)"+1

X>но вот как избавиться от последнего символа?
Да никак.
Но можно отказаться от голого указателя. Используй string_ref, string_view или любой другой аналог невладеющей ссылки на строку. То есть по сути можно перейти к двум указателям или к указателю и длине. Если от строк часто требуется отрезать кусочки или сами строки разрезать по разделителям, то использование такого класса оправдывается.
Re: инициализация c-string с изменением инициализатора
От: Evgeny.Panasyuk Россия  
Дата: 30.11.13 13:50
Оценка: 3 (1)
Здравствуйте, niXman, Вы писали:

X>дано: "(std::vector<int>)"

X>нужно этим инициализировать constexpr указатель, но так, чтоб исключить первый и последний символы, т.е. скобки.

http://coliru.stacked-crooked.com/a/0580dc8dff82a8dd
#include <algorithm>
#include <iostream>
#include <iterator>
#include <cstddef>
using namespace std;

class CTString
{
    const char *first, *last;
public:
    template<size_t N>
    constexpr CTString(const char (&x)[N])
        : first(x), last(x+N-1)
    {}
    friend constexpr const char *begin(const CTString &x)
    {
        return x.first;
    }
    friend constexpr const char *end(const CTString &x)
    {
        return x.last;
    }
};

int main()
{
    constexpr CTString s("(std::vector<int>)");
    constexpr auto first = begin(s);
    constexpr auto last = end(s);
    copy(first + 1, last - 1, ostream_iterator<char>(cout));
}

clang++ -std=c++11 -O3 -pedantic main.cpp -Wall && ./a.out
std::vector<int>
Re[2]: инициализация c-string с изменением инициализатора
От: niXman Ниоткуда https://github.com/niXman
Дата: 30.11.13 16:22
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

это-от понятно, но оно не укладывается в требования.. иначе, придется переписать остальной код.
нужно подумать...

спасибо, вопрос закрыт.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: инициализация c-string с изменением инициализатора
От: Abyx Россия  
Дата: 30.11.13 17:31
Оценка:
Здравствуйте, niXman, Вы писали:

X>привет!


X>дано: "(std::vector<int>)"

X>нужно этим инициализировать constexpr указатель, но так, чтоб исключить первый и последний символы, т.е. скобки.

X>первый исключить легко: constexpr const char *str = "(std::vector<int>)"+1

X>но вот как избавиться от последнего символа?

тебе надо создать строковый литерал в compile-time

можно попробовать static const char y[]{x[i+1]...}, но IIRC static не сочетается с constexpr.
значит никак.
In Zen We Trust
Re: инициализация c-string с изменением инициализатора
От: wander  
Дата: 01.12.13 00:08
Оценка:
Здравствуйте, niXman, Вы писали:

X>привет!


X>дано: "(std::vector<int>)"

X>нужно этим инициализировать constexpr указатель, но так, чтоб исключить первый и последний символы, т.е. скобки.

X>первый исключить легко: constexpr const char *str = "(std::vector<int>)"+1

X>но вот как избавиться от последнего символа?

X>спасибо.


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

typedef CT_STRING("(std::vector<int>)") ct_str;

constexpr char const * str = substr<ct_str,  1, ct_str::length() - 2>::type::value();


Если нужно — могу поискать.
Re[2]: инициализация c-string с изменением инициализатора
От: Evgeny.Panasyuk Россия  
Дата: 01.12.13 00:19
Оценка: 4 (1)
Здравствуйте, wander, Вы писали:

W>Начинал как-то писать библиотеку для такого рода вещей. С ее использованием выглядело бы это как-то так:

W>
W>typedef CT_STRING("(std::vector<int>)") ct_str;
W>constexpr char const * str = substr<ct_str,  1, ct_str::length() - 2>::type::value();
W>


Если нужна строка в виде чего-то типа mpl::vector, то есть например MPLLIBS_STRING.
Re[2]: инициализация c-string с изменением инициализатора
От: niXman Ниоткуда https://github.com/niXman
Дата: 09.12.13 14:12
Оценка:
Здравствуйте, wander, Вы писали:

W>Начинал как-то писать библиотеку для такого рода вещей. С ее использованием выглядело бы это как-то так:


W>
W>typedef CT_STRING("(std::vector<int>)") ct_str;

W>constexpr char const * str = substr<ct_str,  1, ct_str::length() - 2>::type::value();
W>


W>Если нужно — могу поискать.

глянь плиз.
а то не охота тянуть в проект такого монстра как MPLLIBS_STRING, только из-за этой мелочи.

спасибо!
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: инициализация c-string с изменением инициализатора
От: niXman Ниоткуда https://github.com/niXman
Дата: 09.12.13 14:16
Оценка:
ну, или ща посмотрю, чтоб из нее можно выдрать...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: инициализация c-string с изменением инициализатора
От: wander  
Дата: 12.12.13 11:21
Оценка:
Здравствуйте, niXman, Вы писали:

X>ну, или ща посмотрю, чтоб из нее можно выдрать...


Нашел. Куда тебе скинуть? Только учти, что там не боевая библиотека, а исследовательский код. Но концепцию подсмотреть хватит.
Re[4]: инициализация c-string с изменением инициализатора
От: wander  
Дата: 12.12.13 11:31
Оценка:
Здравствуйте, niXman, Вы писали:

X>ну, или ща посмотрю, чтоб из нее можно выдрать...


У него кстати используется BOOST_PP_* и нужно определять макрос ограничивающий длину строки (по сути, костыль). У меня этого нет, но существует другое ограничение. Нельзя сразу передать такую строку в параметр шаблона так:
some_template<CT_STRING("1234")>

Решения, лишённого обоих этих недостатков, я не встречал.
Re[5]: инициализация c-string с изменением инициализатора
От: niXman Ниоткуда https://github.com/niXman
Дата: 12.12.13 11:37
Оценка:
Здравствуйте, wander, Вы писали:

W>Нельзя сразу передать такую строку в параметр шаблона так:

да мне вообще тайпдефить ничего не нужно(если возможно, конечно), по сути.
для моего случая, идеальным было бы такое:
static constexpr const char* arr[] = {
    make_initializer("(int)") // "int"
   ,make_initializer("(long)") // "long"
   ,...
};


так что, покажешь свой вариант?
спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[6]: инициализация c-string с изменением инициализатора
От: wander  
Дата: 12.12.13 14:37
Оценка:
Здравствуйте, niXman, Вы писали:

X>так что, покажешь свой вариант?

X>спасибо.

Покажу. Почту давай.
Re[7]: инициализация c-string с изменением инициализатора
От: niXman Ниоткуда https://github.com/niXman
Дата: 12.12.13 15:01
Оценка:
Здравствуйте, wander, Вы писали:

W>Покажу. Почту давай.

скинул в личку.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[8]: инициализация c-string с изменением инициализатора
От: niXman Ниоткуда https://github.com/niXman
Дата: 12.12.13 15:38
Оценка:
Здравствуйте, niXman, Вы писали:

X>скинул в личку.

пинг?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[9]: инициализация c-string с изменением инициализатора
От: wander  
Дата: 12.12.13 15:46
Оценка: 12 (1) +1
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, niXman, Вы писали:


X>>скинул в личку.

X>пинг?

Отправил. Вот еще ссылку
Автор: wander
Дата: 14.06.12
тебе нарыл свою:
Re[10]: инициализация c-string с изменением инициализатора
От: niXman Ниоткуда https://github.com/niXman
Дата: 12.12.13 16:47
Оценка:
Здравствуйте, wander, Вы писали:

W>Отправил. Вот еще ссылку
Автор: wander
Дата: 14.06.12
тебе нарыл свою:

получил. спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.