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
* 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
тутачки клангчик за релизили
ну за релизили и черт с ним, скажете вы
между версии они каждые две недели клепают
но есть реализация фишки с с++26
https://releases.llvm.org/18.1.0/tools/clang/docs/ReleaseNotes.html#c-2c-feature-support
вкусно же, не нужно придумывать всякие reserved имена переменнымstruct S {
int _, _; // Was invalid, now OK
};
void func() {
int _, _; // Was invalid, now OK
}
void other() {
int _; // Previously diagnosed under -Wunused, no longer diagnosed
}
есть еще P0847R7: Deducing this для C++23
но мне он как то не зашел, не вижу пока применения
llvm 18.1.0
2024-03-06 22:24 reversecode
тутачки клангчик за релизили
ну за релизили и черт с ним, скажете вы
между версии они каждые две недели клепают
но есть реализация фишки с с++26
https://releases.llvm.org/18.1.0/tools/clang/docs/ReleaseNotes.html#c-2c-feature-support
вкусно же, не нужно придумывать всякие reserved имена переменнымstruct S {
int _, _; // Was invalid, now OK
};
void func() {
int _, _; // Was invalid, now OK
}
void other() {
int _; // Previously diagnosed under -Wunused, no longer diagnosed
}
есть еще 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
каким-то образом при наличии НЕшаблонного operator|() для конкретного enum
он перестает его видеть если в неймспейсе A добавить шаблонный оператор|() который всегда отключен.
Что-то я торможу. Не понимаю, что происходит при смене #if 1 / #if 0
Не могу понять прикола
2024-03-05 14:20 K13
каким-то образом при наличии НЕшаблонного 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о
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
Размер пишет 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
Размер пишет 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 хорош тем, что позволяет делать шаблонные алиасы.
И вот мне захотелось сделать алиас шаблонной функции. И что-то не работает. Поверхностное изучение вопроса показало, что шаблонные алиасы работают только для типов, а не для функций. Я что-то не так понял, и это таки возможно, или я всё правильно понял, и это невозможно, но тогда какого хэ?