Войти
ПрограммированиеФорумОбщее

constexpr вычитание указателей

Страницы: 1 2 3 Следующая »
#0
19:36, 31 дек. 2015

Есть класс строки с указателями на начало и на конец и функция Length, которая возвращает разность этих указателей. При вызове этой функции во время компиляции компилятор 2015 студии (Update 1) падает.
Этот код

constexpr const char* const str="egvwgvberb";
constexpr const char* const str2=str+3;
constexpr const uintptr_t str3=str2-str;
тоже падает.
Можно ли как-нибудь обойти проблему, не переделывая класс строки на хранение длины?


#1
20:29, 31 дек. 2015
Выбрать другой компилятор или язык, например
#2
20:31, 31 дек. 2015

Hardcode
> Выбрать другой компилятор или язык, например
Ну это вообще не вариант.

#3
20:49, 31 дек. 2015
gammaker
Пытаться воротить сложные шаблоны в студии - ССЗБ
#4
20:53, 31 дек. 2015

Hardcode
> Пытаться воротить сложные шаблоны в студии - ССЗБ
И где ты видишь сложные шаблоны в этих трёх строчках кода?

#5
21:06, 31 дек. 2015

gammaker
Мне надо было сказать сложный compiletime
Как видишь, он оказался достаточно сложный для студии

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

#6
12:18, 1 янв. 2016

gammaker
Преобразование типов сделай, чтобы не было указателей или юзай строковые литералы в их первозданной форме (массив чаров). Короче ищи тот путь, которым результат будет тот же, что и планировался, а падать не будет

#7
12:29, 1 янв. 2016

laMer007
> Преобразование типов сделай, чтобы не было указателей
Как именно? Преобразование указателя в целочисленный тип constexpr не разрешает. Ну ладно, попробую как-нибудь временно перекантоваться, а когда выйдет новый компилятор и они починят это, сделаю так, как хотел.

#8
12:30, 1 янв. 2016

gammaker
А так:

constexpr const uintptr_t str3=(uintptr_t)(str2-str);
#9
12:46, 1 янв. 2016

Mikle
Пробовал, ошибка происходит до каста.

#10
13:43, 1 янв. 2016

gammaker
> Как именно?
Тебе бы может кто-нибудь уже помог, еслиб ты минимальный код, демонстрирующий проблему со всеми инклудниками выложил.

#11
17:24, 1 янв. 2016

laMer007
> Тебе бы может кто-нибудь уже помог, еслиб ты минимальный код, демонстрирующий
> проблему со всеми инклудниками выложил.
Я хочу сделать compile time строки, при этом в них должны храниться именно указатели на начало и конец, а не начало и длина. Почему? Потому что у меня есть уже готовый класс строки, в котором сделано именно так и я не хочу дублировать и переделывать кучу кода. Хочу объединить всё это в общий код.

class StringView
{
public:
        constexpr StringView(const char* start_, const char* end_): start(start_), end(end_) {}
  constexpr uintptr_t Length() const {return end-start;} //internal compiler error

  //... Сравнение, взятие подстроки, поиск и т.п. ...

private:
  const char* start;
  const char* end;
};
class string: public StringView
{
public:
  //... Конкатенация, замена, управление своей памятью и т.п. ...
};
Я конечно могу сам придумать, как реализовать частный случай нужных compile-time вещей без StringView, но это будет не очень красиво. Поэтому вопрос в том, можно ли как-то придумать, как вычесть эти указатели или нельзя и придётся отказаться от StringView в compile time?
#12
18:49, 1 янв. 2016

gammaker
> Потому что у меня есть уже готовый класс строки
Ты вообще уверен, что твои строки в компайлтайме взлетят? Я констэкспрес не пользуюсь, но _мне говорили_, что даже std::string не взлетает почти в компайлтайме при конкатинации.

Ну вот что ты выложил? Помнишь, что говорил Kartonagnick? Выкладывай с инклудниками, майном, примером что это не работает на онлайнкомпиляторе давай, а не просто чтобы мы все за тебя сделали. Никто уважающий себя даже пытаться не будет делать за тебя твою работу. Где уважение к собеседникам? Учись задавать вопросы, как это делает Suslik

#13
19:07, 1 янв. 2016

laMer007
> Я констэкспрес не пользуюсь, но _мне говорили_, что даже std::string не
> взлетает почти в компайлтайме при конкатинации.
Мне не нужна конкатенация в compile time.

laMer007
> Ты вообще уверен, что твои строки в компайлтайме взлетят?
В компайлтайме мне нужен минимум функционала StringView: конструктор от литерала, operator[] и Length(). Я могу всё это обеспечить, чтобы это работало, если хранить длину. А если хранить указатель на конец, то получается такая ошибка компиляции. Как вариант, делать отдельные классы для compile time и для runtime, либо переделать огромный класс строки с указателями start и end на хранение и работу с length. Но я хочу объединить в один, не переделывая это.

laMer007
> Выкладывай с инклудниками, майном, примером что это не работает на
> онлайнкомпиляторе давай
А есть онлайн компилятор из студии? На GCC\Clang наверняка всё сразу работать будет.

>а не просто чтобы мы все за тебя сделали.
>Никто уважающий себя даже пытаться не будет делать за тебя твою работу.
Какую работу? Мне нужно обойти баг компилятора MS, который полностью выражен в тех трёх строчках. Всё остальное к этому значения почти не имеет. Мой вопрос лишь про то, как записать строчку 3 из нулевого поста, чтобы не было ошибки компиляции, либо убедить меня в том, что это сделать невозможно и нужно с этим смириться. А всё остальное, что я тут написал, это вы уже подробности выпытали, который имеют к этому лишь косвенное отношение.

#14
19:10, 1 янв. 2016

gammaker
>А есть онлайн компилятор из студии?
Как минимум:
http://rextester.com/l/cpp_online_compiler_visual

//Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23026 for x86
Страницы: 1 2 3 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.