Информация об изменениях

Сообщение Re: Концепция умного C++ от 18.04.2025 9:07

Изменено 18.04.2025 9:43 rg45

Re: Концепция умного C++
Здравствуйте, Shmj, Вы писали:

S>B здесь главное не поддаться греху гордыни — когда тебе хочется доказать другим что ты способен, что SFINAE и 4-х этажные шаблоны тебе по плечу. А нужно не поддаваться греху гордыни а наоборот проявить смирение и кротость — аскетизм. Ограничить себя в излишествах и довольствоваться простым минимализмом.

S>


На этот вопрос я тебе уже отвечал
Автор: rg45
Дата: 16.04.25
, но ты, как обычно, предпочёл "не заметить" неудобную информацию.

Что ж, повторюсь. Нормальные программисты используют шаблоны и SFINAE совсем не для того, чтобы кому-то что-то доказать, а для того, чтобы решать какие-то задачи. Отказ от использования перечисленного — это просто отказ от решения задач. А сложный и запутанный код, как правило, получается у новичков, которые только начинают осваивать этот подход. У опытных программистов даже со SFINAE код получается понятным и читабельным, вот тебе свежий пример:

http://rsdn.org/forum/cpp/8923323.1
Автор: rg45
Дата: 18.04.25


template<typename CharPointerType>
const char* rawConstCharPtrFromIterator(CharPointerType* pstr)
{
   return reinterpret_cast<const char*>(pstr);
}

template <typename IteratorType, std::enable_if_t<
    IsDereferenceableToLvalue<IteratorType>
    and not IsPointer<IteratorType>
, int> = 0>
const char* rawConstCharPtrFromIterator(IteratorType it)
{
   return reinterpret_cast<const char*>(&*it);
}


Также повторюсь, что SFINAE потерял актуальность с приходом концептов. И современный C++ позволяет записывать то же самое компактнее и элегантнее:

http://rsdn.org/forum/cpp/8923201.1
Автор: rg45
Дата: 18.04.25


const char* rawConstCharPtrFromIterator(Pointer auto p)
{
   return reinterpret_cast<const char*>(p);
}
const char* rawConstCharPtrFromIterator(Dereferenceable auto it)
{
   return reinterpret_cast<const char*>(&*it);
}



Но главное, чего ты не соображаешь — это то, что некоторая сложность шаблонных сущностей — это всего лишь скромная плата за то упрощение, которое они дают в точках использования, число которых несоизмеримо больше:

   rawConstCharPtrFromIterator(c);
   rawConstCharPtrFromIterator(s.begin());
   rawConstCharPtrFromIterator(it);


Такие как предпочитают размазать говно по всему коду, вместо того, чтобы в одном месте написать пару несложных шаблончиков. И это вовсе не по каким-то принципиальным соображениям, а просто потому, что вам это недоступно, вот и всё.

А ты просто неуч и лентяй. Вместо того, чтобы учиться и осваивать язык, ты ищешь способы, как программировать, не приходя в сознание.
Re: Концепция умного C++
Здравствуйте, Shmj, Вы писали:

S>B здесь главное не поддаться греху гордыни — когда тебе хочется доказать другим что ты способен, что SFINAE и 4-х этажные шаблоны тебе по плечу. А нужно не поддаваться греху гордыни а наоборот проявить смирение и кротость — аскетизм. Ограничить себя в излишествах и довольствоваться простым минимализмом.

S>


На этот вопрос я тебе уже отвечал
Автор: rg45
Дата: 16.04.25
, но ты, как обычно, предпочёл "не заметить" неудобную информацию.

Что ж, повторюсь. Нормальные программисты используют шаблоны и SFINAE совсем не для того, чтобы кому-то что-то доказать, а для того, чтобы решать какие-то задачи. Отказ от использования перечисленного — это просто отказ от решения задач. А сложный и запутанный код, как правило, получается у новичков, которые только начинают осваивать этот подход. У опытных программистов даже со SFINAE код получается понятным и читабельным, вот тебе свежий пример:

http://rsdn.org/forum/cpp/8923323.1
Автор: rg45
Дата: 18.04.25


template<typename CharPointerType>
const char* rawConstCharPtrFromIterator(CharPointerType* pstr)
{
   return reinterpret_cast<const char*>(pstr);
}

template <typename IteratorType, std::enable_if_t<
    IsDereferenceableToLvalue<IteratorType>
    and not IsPointer<IteratorType>
, int> = 0>
const char* rawConstCharPtrFromIterator(IteratorType it)
{
   return reinterpret_cast<const char*>(&*it);
}


Также повторюсь, что SFINAE потерял актуальность с приходом концептов. И современный C++ позволяет записывать то же самое компактнее и элегантнее:

http://rsdn.org/forum/cpp/8923201.1
Автор: rg45
Дата: 18.04.25


const char* rawConstCharPtrFromIterator(Pointer auto p)
{
   return reinterpret_cast<const char*>(p);
}
const char* rawConstCharPtrFromIterator(Dereferenceable auto it)
{
   return reinterpret_cast<const char*>(&*it);
}



Но главное, чего ты не соображаешь — это то, что некоторая сложность шаблонных сущностей — это всего лишь скромная плата за то упрощение, которое они дают в точках использования, число которых несоизмеримо больше:

   rawConstCharPtrFromIterator(c);
   rawConstCharPtrFromIterator(s.begin());
   rawConstCharPtrFromIterator(it);


Такие как предпочитают размазать говно по всему коду, вместо того, чтобы в одном месте написать пару несложных шаблончиков. И это вовсе не по каким-то принципиальным соображениям, а просто потому, что вам это недоступно, вот и всё.

А конкретно ты — просто неуч и лентяй. Вместо того, чтобы учиться и осваивать язык, ты ищешь способы, как программировать, не приходя в сознание.