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

16
Как передать ссылку на аргумент typename шаблона

Есть ли способ передать ссылку в качестве аргумента аргументу типа имя шаблона? Я имею в виду, что вместо передачи int, например, чтобы передать ссылку на int. template <typename T> struct Foo { Foo(T arg) : ptr(arg) {} T ptr; }; int main() { int* a = new int(6); Foo<decltype(a)>...

15
Как иметь переменную 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 int N = i; // dont know how...

14
Функция шаблона не работает для функции указатель на член, принимающей 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())...

14
Какой смысл знать, является ли объект целым или нет, или это тип класса или нет?

Здравствуйте, я видел много таких примеров на Cppreference.com: std::is_class<T> std::is_integral И так далее. Я знаю, если я запускаю код, например, я получаю trueили false. Но какой в ​​этом смысл? Например, зная, что объект имеет тип класса или нет? #include <iostream> #include...

13
если constexpr с static_assert в лямбде, какой компилятор правильный?

Когда мы хотим использовать a static_assertв a, if constexprмы должны сделать условие зависимым от некоторого параметра шаблона. Интересно, что gcc и clang не согласны, когда код обернут в лямбду. Следующий код компилируется с помощью gcc, но clang запускает утверждение, даже если значение if...

13
Как сравнить общие структуры в C ++?

Я хочу сравнить структуры в общем виде, и я сделал что-то вроде этого (я не могу поделиться фактическим источником, поэтому попросите более подробную информацию, если это необходимо): template<typename Data> bool structCmp(Data data1, Data data2) { void* dataStart1 =...

13
Выполнять функцию внутри шаблона функции только для тех типов, для которых определена функция

У меня есть шаблон функции, который принимает много разных типов в качестве входных данных. Из этих типов только один из них имеет getInt()функцию. Поэтому я хочу, чтобы код запускал функцию только для этого типа. Пожалуйста, предложите решение. Спасибо #include <type_traits> #include...

12
Передача концепции в функцию

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

12
Определение C ++ 20 вне класса в шаблонном классе

Вплоть до C ++ 20 стандарта C ++, когда мы хотели определить внеклассный оператор, который использует некоторые закрытые члены шаблонного класса, мы использовали конструкцию, подобную этой: template <typename T> class Foo; template <typename T> constexpr bool operator==(T lhs, const...

11
Может ли переменный шаблон передаваться как аргумент шаблона шаблона?

Следующий бессмысленный пример не компилируется, но есть ли другой способ передать шаблон переменной в качестве аргумента шаблона шаблона? template<typename T> constexpr auto zero = T{0}; template<typename T, template<typename> auto VariableTemplate> constexpr auto add_one() {...

10
Почему не обязательно использовать typename для зависимых типов в следующем случае?

Я читал об удалении ссылки типа здесь . Это дает следующий пример: #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...

10
Вывод аргумента шаблона для аргумента типа функции

Рассмотрим следующую программу. #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 ); } Программа успешно компилируется, и ее вывод g( 42 ); Теперь давайте...