Отправляет email-рассылки с помощью сервиса Sendsay

RSS-канал «Форум 'C/C++' на RSDN»

Доступ к архиву новостей RSS-канала возможен только после подписки.

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

   

Подписаться на другой RSS-канал, зная только его адрес или адрес сайта.

Код формы подписки на этот канал для вашего сайта:

Форма для любого другого канала

Последние новости

Функция, принимающая вложенный класс шаблонного класса.
2024-04-04 06:08 johny5

Нужно написать шаблонную функцию, которая принимала бы аргументом вложенный шаблонный класс шаблонного класса и сама вывела бы все шаблонные аргументы.
Не гуглится и не кодится никак. Последнее где я застрял.

template<template<typename> typename T1, typename T2,
  template<typename> typename T3, typename T4>
void f(typename T1<T2>::T3<T4> val) {  }

template<typename T>
struct A
{
    template<typename S>
    struct B{};
};

int main() {
    f( A<int>::B<void>() );
}



Ошибки:

<source>:17:6: error: no matching function for call to 'f(A<int>::B<void>)'
17 | f( A<int>::B<void>() );
| ~^~~~~~~~~~~~~~~~~~~~~

<source>:7:6: note: candidate: 'template<template<class> class T1, class T2, template<class> class T3, class T4> void f(typename T1<T2>::T3<T4>)'
7 | void f(typename T1<T2>::T3<T4> val) { }
| ^

<source>:7:6: note: template argument deduction/substitution failed:

<source>:17:6: note: couldn't deduce template parameter 'template<class> class T1'
17 | f( A<int>::B<void>() );
| ~^~~~~~~~~~~~~~~~~~~~~


Убирая T3 полностью и заменяя его на явное B — помогает но это не то что нужно. Но и даже в этом случае приходится указывать все шаблонные параметры для вызова f() ручками, что нежелательно потому как весь смысл этой функции — это вывести все эти T1, .. T4 аргументы шаблона автоматически.

Цель работы — написать навороченный принтер типов, когда мы разваливаем входящий шаблон на запчасти, конвертируем в строку вложенные типы (через constexpr std::source_location::function_name()) и склеиваем всё это по какому-то шаблону, и всё в компайл-тайм.

С++ 20++.

Функция, принимающая вложенный класс шаблонного класса.
2024-04-04 06:08 johny5

Нужно написать шаблонную функцию, которая принимала бы аргументом вложенный шаблонный класс шаблонного класса и сама вывела бы все шаблонные аргументы.
Не гуглится и не кодится никак. Последнее где я застрял.

template<template<typename> typename T1, typename T2,
  template<typename> typename T3, typename T4>
void f(typename T1<T2>::T3<T4> val) {  }

template<typename T>
struct A
{
    template<typename S>
    struct B{};
};

int main() {
    f( A<int>::B<void>() );
}



Ошибки:

<source>:17:6: error: no matching function for call to 'f(A<int>::B<void>)'
17 | f( A<int>::B<void>() );
| ~^~~~~~~~~~~~~~~~~~~~~

<source>:7:6: note: candidate: 'template<template<class> class T1, class T2, template<class> class T3, class T4> void f(typename T1<T2>::T3<T4>)'
7 | void f(typename T1<T2>::T3<T4> val) { }
| ^

<source>:7:6: note: template argument deduction/substitution failed:

<source>:17:6: note: couldn't deduce template parameter 'template<class> class T1'
17 | f( A<int>::B<void>() );
| ~^~~~~~~~~~~~~~~~~~~~~


Убирая T3 полностью и заменяя его на явное B — помогает но это не то что нужно. Но и даже в этом случае приходится указывать все шаблонные параметры для вызова f() ручками, что нежелательно потому как весь смысл этой функции — это вывести все эти T1, .. T4 аргументы шаблона автоматически.

Цель работы — написать навороченный принтер типов, когда мы разваливаем входящий шаблон на запчасти, конвертируем в строку вложенные типы (через constexpr std::source_location::function_name()) и склеиваем всё это по какому-то шаблону, и всё в компайл-тайм.

С++ 20++.

cppmeta R&D compiler
2024-03-25 19:03 flаt

https://codereckons.com/articles

* An Informal introduction to CODE RECKONS CppMeta compiler
* Reflection use cases

Попробовать: https://cppmeta.codereckons.com

llvm 18.1.0
2024-03-06 22:24 reversecode

https://github.com/llvm/llvm-project/releases/tag/llvmorg-18.1.0
тутачки клангчик за релизили
ну за релизили и черт с ним, скажете вы
между версии они каждые две недели клепают
но есть реализация фишки с с++26

https://releases.llvm.org/18.1.0/tools/clang/docs/ReleaseNotes.html#c-2c-feature-support

struct S {
int _, _; // Was invalid, now OK
};
void func() {
int _, _; // Was invalid, now OK
}
void other() {
int _; // Previously diagnosed under -Wunused, no longer diagnosed
}

вкусно же, не нужно придумывать всякие reserved имена переменным

есть еще P0847R7: Deducing this для C++23
но мне он как то не зашел, не вижу пока применения

llvm 18.1.0
2024-03-06 22:24 reversecode

https://github.com/llvm/llvm-project/releases/tag/llvmorg-18.1.0
тутачки клангчик за релизили
ну за релизили и черт с ним, скажете вы
между версии они каждые две недели клепают
но есть реализация фишки с с++26

https://releases.llvm.org/18.1.0/tools/clang/docs/ReleaseNotes.html#c-2c-feature-support

struct S {
int _, _; // Was invalid, now OK
};
void func() {
int _, _; // Was invalid, now OK
}
void other() {
int _; // Previously diagnosed under -Wunused, no longer diagnosed
}

вкусно же, не нужно придумывать всякие reserved имена переменным

есть еще P0847R7: Deducing this для C++23
но мне он как то не зашел, не вижу пока применения

Так С++23 уже утвержден или нет ?
2024-03-06 06:33 LaptevVV

Если утвержден, то где взять последний драфт ?
И сорока на хвосте принесла, что asio принята в качестве стандартной сетевой библиотеки.
Это в С++23 или в С++26 ?

Так С++23 уже утвержден или нет ?
2024-03-06 06:33 LaptevVV

Если утвержден, то где взять последний драфт ?
И сорока на хвосте принесла, что asio принята в качестве стандартной сетевой библиотеки.
Это в С++23 или в С++26 ?

Не могу понять прикола
2024-03-05 14:20 K13

код: https://coliru.stacked-crooked.com/a/053394d0fc0b2cdb

каким-то образом при наличии НЕшаблонного operator|() для конкретного enum
он перестает его видеть если в неймспейсе A добавить шаблонный оператор|() который всегда отключен.

Что-то я торможу. Не понимаю, что происходит при смене #if 1 / #if 0

Не могу понять прикола
2024-03-05 14:20 K13

код: https://coliru.stacked-crooked.com/a/053394d0fc0b2cdb

каким-то образом при наличии НЕшаблонного operator|() для конкретного enum
он перестает его видеть если в неймспейсе A добавить шаблонный оператор|() который всегда отключен.

Что-то я торможу. Не понимаю, что происходит при смене #if 1 / #if 0

концепты как параметры шаблонов
2024-03-04 01:38 rg45

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

А прикиньте, как было бы классно:

template <typename T, template <typename> concept C>
concept RangeOf = std::ranges::range<T> && C<std::ranges::range_value_t<T>>;

void foo(RangeOf<std::convertible_to<double>> auto&& r) { /* . . . */ }

концепты как параметры шаблонов
2024-03-04 01:38 rg45

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

А прикиньте, как было бы классно:

template <typename T, template <typename> concept C>
concept RangeOf = std::ranges::range<T> && C<std::ranges::range_value_t<T>>;

void foo(RangeOf<std::convertible_to<double>> auto&& r) { /* . . . */ }

Современные компиляторы и NRVO
2024-03-01 19:22 _NN_

Насколько вы полагаетесь на оптимизацию компилятора ?

Скажем даже MSVC подтянулся с оптимизацией: MSVC Improving Copy and Move Elision.
Однако, стандарт не гарантирует нам отсутствие копирования в отличии от гарантий временного объекта.

В идеале хотелось бы проверку на этапе компиляции в отсутствии копирования.
С другой стороны, можно всегда приводить к rvalue и получить гарантировано отсутствие копирования, правда с гарантированным перемещением, которого не будет в случае NRVO.

struct MyType { ... };

MyType might_copy() {
 MyType m;
 // много-много кода
 return m;
}

MyType always_move() {
 MyType m;
 // много-много кода
 return std::move(m);
}

выделить тип из optional который сам template type
2024-02-01 18:20 The Passenger

Что надо — функция которая может принимать ссылку на некий темплейт
темплейт может быть как простым типом типа инта или дубля, я может быть optional для простых типов ... но они тоже могут быть разные

1. Как определить что тип optional?
2. Как вычленить тип из optional?

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

Спасибки

выделить тип из optional который сам template type
2024-02-01 18:20 The Passenger

Что надо — функция которая может принимать ссылку на некий темплейт
темплейт может быть как простым типом типа инта или дубля, я может быть optional для простых типов ... но они тоже могут быть разные

1. Как определить что тип optional?
2. Как вычленить тип из optional?

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

Спасибки

Как взять количество элементов из инициализатора?
2024-01-20 12:38 drVanо

Вот тут хочется на автомате передать количество элементов в инициализаторе в поле size:

    struct token_encoding_t
    {
        token_type_id types[20];
        uint8_t size;
        uint8_t bits;
    };


Сейчас приходится писать руками, может быть есть способ лучше.

Приведение типов итераторов для контейнера с базовым типом
2024-01-12 11:59 drVanо

Есть контейнер, который хранит указатели на объекты:
template <typename Object>
class ObjectList : public IObject
{
public:
    typedef typename std::vector<Object *> list;
    typedef typename list::const_iterator const_iterator;
    typedef typename list::iterator iterator;

    const_iterator begin() const { return items_.begin(); }
    const_iterator end() const { return items_.end(); }

    iterator begin() { return items_.begin(); }
    iterator end() { return items_.end(); }
protected:
    list items_;
};


Есть некий базовый класс:
class BaseImportList : public ObjectList<BaseImport>
{
...
}


И есть потомок, который хранит в контейнере предка от BaseImport:
class MacImport : public BaseImport
{
...
}

class MacImportList : public BaseImportList
{
    typedef typename std::vector<MacImport *> list;
    list::const_iterator begin() const { return reinterpret_cast<const list &>(items_).begin(); }
    list::const_iterator end() const { return reinterpret_cast<const list &>(items_).end(); }
}


Вопрос, как вытащить "std::vector" из ObjectList для приведения типов итератора чтобы больше никогда не зависеть от типа контейнера в базовом классе?

Арифметика long double
2024-01-12 09:26 LaptevVV

Как реализована арифметика c long double в gcc ?
Размер пишет 16 байт, но в интел такого аппаратного размера нет.
Или в современных уже есть ?
Регистры сопроцессора были по 80 бит.
Но последняя версия стандарта ieee-754 включает 128-битные дробные
Кто знает, оно уже в аппаратуре есть или нет ?

Версия gcc jn 8.1 до 11.0
С++17 по любому есть (хотя в 8.1 не совсем полный).

Обнаружил стандарт: https://en.wikipedia.org/wiki/IEEE_754
Там даже 256-битные есть.
Но насколько они реализованы в железе ?

Арифметика long double
2024-01-12 09:26 LaptevVV

Как реализована арифметика c long double в gcc ?
Размер пишет 16 байт, но в интел такого аппаратного размера нет.
Или в современных уже есть ?
Регистры сопроцессора были по 80 бит.
Но последняя версия стандарта ieee-754 включает 128-битные дробные
Кто знает, оно уже в аппаратуре есть или нет ?

Версия gcc jn 8.1 до 11.0
С++17 по любому есть (хотя в 8.1 не совсем полный).

Обнаружил стандарт: https://en.wikipedia.org/wiki/IEEE_754
Там даже 256-битные есть.
Но насколько они реализованы в железе ?

ADL не ADL? Или как?
2024-01-07 22:42 Marty

Здравствуйте!

Есть у меня сериализация/десериализация enum'ов.

Она на внешнем генераторе, в результате его работы в том же пространстве имён, в котором объявлен enum, появляется функция:
inline
EnumType enum_deserialize(const std::string &str, EnumType defVal);


Обычно у меня есть EnumType::invalidValue, я его передаю как defVal, и если на выходе получил EnumType::invalidValue, то кидаю исключение.
Поиск реализации идёт через ADL по дефолтному значению, и всё в общем-то работает.

Есть ещё функция
inline
EnumType enum_deserialize_##EnumType(const std::string &str);


Она сама умеет кидать исключение, но её имя генерится на макросах и зависит от имени enum'а.

Теперь я хочу сделать шаблонную функцию enum_deserialize, чтобы тип enum'а она получала как параметр шаблона.
Пока я сделал, основываясь на том, что EnumType::invalidValue у меня всегда -1, и я использую первую версию, передаю туда инвалида (-1), и на выходе с этим инвалидом сравниваю, и кидаю исключение, если что-то пошло не так.

Но это завязано на мои соглашения, что EnumType::invalidValue у меня всегда -1. С enum'ами, константы для которых могут зависеть от внешних спек, такое может не прокатить.

Наивная идея была сделать общий шаблон enum_deserialize_throwable, и генерить специализации для него. Но потом я вспомнил, что все сгенерённые функции попадают в то же пространство имён, что и сам enum, и это могут быть любые NS, и точно не то NS, в котором объявлен шаблон, который я хотел специализировать.

Как быть?


ЗЫ Генератор генерит кот через эти матросики — https://github.com/al-martyn1/marty_cpp/blob/main/marty_enum.h
Пример сгенерённого кода — https://github.com/al-martyn1/marty_cpp/blob/main/enums.h

template using для функции
2024-01-05 23:25 Marty

Здравствуйте!

Я вообще отстал от жизни, как привык по старинке использовать typedef, так и использую.

Но новый using хорош тем, что позволяет делать шаблонные алиасы.

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