Вопросы с тегом «templates»

Тег templates используется в нескольких контекстах: общее программирование (особенно C ++) и генерация данных / документов с использованием шаблонизаторов. При использовании этого тега в сложных вопросах реализации - пометьте язык кода, на котором написана реализация.

5
Как иметь переменную const в цикле for для генерации шаблонных классов?
У меня есть код как template <size_t N> class A { template <size_t N> someFunctions() {}; }; Теперь я хочу создать экземпляры класса и вызвать его функции в цикле for для множества значений: // in main() int main() { for (int i = 1; i <= 100; i++) { const …

1
Clang не компилирует код, но gcc и msvc скомпилировали его
Я не понимаю, в чем проблема: в моем коде или в компиляторе (менее возможно). Вот такой кусок кода: #include <iostream> #include <type_traits> #include <set> template<typename T, typename = void> struct TestA: std::false_type {}; template<typename T> struct TestA<T, std::void_t<typename T::reverse_iterator>> : std::true_type {}; template<typename T> struct TestA<T, std::void_t<typename T::dummy_iterator>> : std::true_type …

2
Какой смысл знать, является ли объект целым или нет, или это тип класса или нет?
Здравствуйте, я видел много таких примеров на Cppreference.com: std::is_class<T> std::is_integral И так далее. Я знаю, если я запускаю код, например, я получаю trueили false. Но какой в ​​этом смысл? Например, зная, что объект имеет тип класса или нет? #include <iostream> #include <type_traits> struct A {}; class B {}; enum class …
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()); } } …
14 c++  templates 

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

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 foo' …

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 …

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 Foo(T …
12 c++  templates  c++20 

2
Передача концепции в функцию
Поскольку понятия определены как предикаты времени компиляции, возможно ли также фактически использовать эти предикаты для алгоритмов времени компиляции? Например, можно ли проверить, все ли типы в кортеже соответствуют концепции? Насколько я видел, невозможно передать концепцию какой-либо функции, что побуждает меня вернуться к использованию шаблонов для этих случаев. #include <type_traits> template<typename …

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)); do …

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>(); } Попробуйте в Compiler Explorer

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) …

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 Теперь рассмотрим следующую функцию шаблона: template<typename …
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 ); } Программа успешно компилируется, и ее …

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.