Запитання з тегом «templates»

Тег шаблонів використовується в декількох контекстах: загальне програмування (особливо C ++) та генерація даних / документів за допомогою двигунів шаблонів. Під час використання цього тегу для впровадження важких питань - позначте мову коду, на якій написано реалізацію.

2
Який сенс дізнатися, чи є об’єкт інтегральним чи ні, чи є класовим типом чи ні?
Привіт, я бачив багато подібних прикладів на Cppreference.com: std::is_class<T> std::is_integral І так далі. Я знаю, якщо я запускаю код, наприклад, отримую trueабо false. Але який сенс у цьому? наприклад, знаючи об’єкт типу класу чи ні? #include <iostream> #include <type_traits> struct A {}; class B {}; enum class C {}; int …
14 c++  templates 

3
Функція шаблону не працює для функції вказівника на члена, яка приймає const ref
Нещодавно я написав функцію шаблону для вирішення деяких повторень коду. Це виглядає приблизно так: template<class T, class R, class... Args> R call_or_throw(const std::weak_ptr<T>& ptr, const std::string& error, R (T::*fun)(Args...), Args... args) { if (auto sp = ptr.lock()) { return std::invoke(fun, *sp, args...); } else { throw std::runtime_error(error.c_str()); } } int …
14 c++  templates 

1
Проблема компілятора C ++ із структурою в класі шаблонів
Наступний код не компілюється з gcc або clang. template<class T> class foo{}; template<class T> class template_class_with_struct { void my_method() { if(this->b.foo < 1); }; struct bar { long foo; } b; }; Повідомлення про помилку є error: type/value mismatch at argument 1 in template parameter list for 'template<class T> class …

3
Виконати функцію всередині шаблону функції лише для тих типів, у яких визначена функція
У мене є шаблон функції, який приймає багато різних типів як його введення. З цих типів лише один з них має getInt()функцію. Отже, я хочу, щоб код запускав функцію лише для цього типу. Просимо запропонувати рішення. Дякую #include <type_traits> #include <typeinfo> class X { public: int getInt(){ return 9; } …

6
Як порівняти родові структури в C ++?
Я хочу порівняти структури в загальному вигляді, і я зробив щось подібне (я не можу поділитися фактичним джерелом, тому запитайте більше деталей, якщо це необхідно): template<typename Data> bool structCmp(Data data1, Data data2) { void* dataStart1 = (std::uint8_t*)&data1; void* dataStart2 = (std::uint8_t*)&data2; return memcmp(dataStart1, dataStart2, sizeof(Data)) == 0; } Це здебільшого …

2
якщо constexpr із static_assert в лямбда, який компілятор є правильним?
Коли ми хочемо використовувати a static_assertв a, if constexprми повинні зробити умову залежною від певного параметра шаблону. Цікаво, що gcc та clang не погоджуються, коли код загорнутий у лямбда. Наступний код компілюється з gcc, але clang викликає ствердження, навіть якщо це if constexprне може бути правдою. #include <utility> template<typename T> …

1
C ++ 20 визначення поза класу в шаблоновому класі
До C ++ 20 стандарту C ++, коли ми хотіли визначити позакласного оператора, який використовує деякі приватні члени шаблонного класу, ми будемо використовувати конструкцію, подібну до цього: template <typename T> class Foo; template <typename T> constexpr bool operator==(T lhs, const Foo<T>& rhs); template <typename T> class Foo { public: constexpr …
12 c++  templates  c++20 

2
Передача поняття функції
Оскільки поняття визначені як предикати часу компіляції, чи можливо також реально використовувати ці предикати для алгоритмів часу компіляції? Наприклад, чи можна було б перевірити, чи всі типи в кортежі відповідають поняттю? Наскільки я бачив, неможливо жодним чином передати поняття функції, що призводить мене до використання шаблонів для цих випадків. #include …

1
Чому цей код займає стільки часу, щоб компілювати з g ++?
Розглянемо наступний код: template<int i> class A { typedef A<i-1> B; B x, y; }; template<> class A<0> { char m; }; int main() { A<LEVEL> a; } При порівняльному оцінці його складання за допомогою g ++ за допомогою наступної команди Bash (з g ++ 8.3.0) for ((level=1; level<30; ++level)); …

1
Чи може змінний шаблон передаватися як аргумент шаблону шаблону?
Наведений нижче безглуздий приклад не компілює, але чи є інший спосіб передати змінний шаблон як аргумент шаблону шаблону? template<typename T> constexpr auto zero = T{0}; template<typename T, template<typename> auto VariableTemplate> constexpr auto add_one() { return VariableTemplate<T> + T{1}; } int main() { return add_one<int, zero>(); } Спробуйте в Провіднику компілятора

2
Вирахування типів аргументів шаблону C ++:
У мене є код, який знаходить і роздруковує відповідність візерунка як перехід над контейнером рядків. Друк виконується у шаблоні функції foo Код #include <iostream> #include <algorithm> #include <iterator> #include <vector> #include <string> #include <tuple> #include <utility> template<typename Iterator, template<typename> class Container> void foo(Iterator first, Container<std::pair<Iterator, Iterator>> const &findings) { for …

1
Проблема в GCC / C ++ 17 з класом шаблону шаблонів
Розглянемо 2 наступні перевантаження template<typename T> bool test() { return true; } template<template<typename ...> class T> bool test() { return false; } Перший працює для звичайних занять, а другий - для шаблонів, які не є інстанційними. Наприклад: std::cout<<test<int>()<<std::endl; <-- this yields 1 std::cout<<test<std::list>()<<std::endl; <--this yields 0 Тепер розглянемо наступну функцію …
10 c++  templates  gcc  clang  c++17 

2
Вирахування аргументу шаблону для аргументу типу функції
Розглянемо наступну програму. #include <iostream> template <typename T> void f( void ( *fn )( T ) ) { fn( 42 ); } void g( int x ) { std::cout << "g( " << x << " );\n"; } int main() { f( g ); } Програма успішно збирається, і її …

3
Чому в наступному випадку не потрібно використовувати назви типу для залежних типів?
Я читав про видалення посилання на тип тут . Він наводить такий приклад: #include <iostream> // std::cout #include <type_traits> // std::is_same template<class T1, class T2> void print_is_same() { std::cout << std::is_same<T1, T2>() << '\n'; } int main() { std::cout << std::boolalpha; print_is_same<int, int>(); print_is_same<int, int &>(); print_is_same<int, int &&>(); print_is_same<int, …


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.