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

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

3
Как я могу получить глубину многомерного std :: vector во время компиляции?
У меня есть функция, которая принимает многомерный std::vectorи требует, чтобы глубина (или количество измерений) передавалась как параметр шаблона. Вместо жесткого кодирования этого значения я хотел бы написать constexprфункцию, которая будет принимать std::vectorи возвращать глубину как unsigned integerзначение. Например: std::vector<std::vector<std::vector<int>>> v = { { { 0, 1}, { 2, 3 } …

2
Почему remove_reference не работает с функциями?
Сталкивался с чем-то странным, когда делал шаблонное метапрограммирование на днях. Это в основном сводится к тому, что утверждение не (как я и ожидал) не прошло. static_assert(std::is_same_v<void(), std::remove_reference_t<void()&>>); Сначала я думал, что допустил синтаксическую ошибку при определении ссылки на функцию, но это утверждение проходит, показывая, что это не так. static_assert(std::is_same_v<void()&, void()&>); …
38 c++  templates  types  c++17 

4
Шаблон метапрограммирования
Может кто-нибудь объяснить мне, почему первый способ метапрограммирования шаблона идет в бесконечный цикл, а второй работает правильно. #include <iostream> using namespace std; template<int N, int M> struct commondivs { static const int val = (N<M) ? commondivs<N,(M-N)>::val : commondivs<(N-M),M>::val; }; template<int N> struct commondivs<N,N> { static const int val = …

4
Перегрузка функции с помощью шаблонов
Я пытаюсь определить функцию, используя шаблоны, и я хочу, чтобы typename было либо int, либо anEnum (конкретное перечисление, которое я определил). Я пробовал следующее, но мне не удалось: template <int | anEnum T> // or <int T, anEnum T> or <int, anEnum T> bool isFunction(const T &aVariable){} Я пытаюсь использовать …

3
Как я могу создать способ декартово произведение списков типов в C ++?
Самоочевидно. В основном, скажем, у меня есть списки типов, например, так: using type_list_1 = type_list<int, somestructA>; using type_list_2 = type_list<somestructB>; using type_list_3 = type_list<double, short>; Они могут быть различными числами списков типов. Как я могу получить список картезианского продукта? result = type_list< type_list<int, somestructB, double>, type_list<int, somestructB, short>, type_list<somestructA, somestructB, …

4
Контейнер STL с определенным типом в качестве универсального аргумента
Есть ли способ, которым я могу сделать функцию, которая принимает контейнер с определенным типом (скажем, std::stringв качестве параметра) void foo(const std::container<std::string> &cont) { for(std::string val: cont) { std::cout << val << std::endl; } } и вызвать его для каждого типа контейнера STL в качестве ввода? как выше? std::set<std::string> strset; std::vector<std::string> …

1
'auto' как заполнитель аргумента шаблона для параметра функции
C ++ 20 позволяет использовать autoдля параметра типа функции. Позволяет ли он также использовать autoв качестве заполнителя аргумента шаблона (не похоже, но в духе C ++ 17 template <auto> в некотором смысле) для типа параметра функции? Итак, следующий код, предварительно C ++ 20: template<typename First, typename Second> void printPair(const std::pair<First, …
22 c++  templates  auto  c++20 

4
Как вызвать правильный конструктор типа шаблона?
В следующем коде, как я могу сделать так, чтобы закомментированная строка работала так же, как строка чуть выше? Я хотел бы сделать его универсальным кодом, который вызывает подходящий конструктор шаблона Type. #include <string> #include <iostream> template <typename Type> struct Class { Type data; Class(Type data) : data(data) { } }; …


1
Автоматический возврат типа шаблона и неоднозначность
У меня перегружена функция шаблона: template<typename T1, typename T2> auto overMax(T1 a, T2 b) { std::cout << __FUNCSIG__ << std::endl; return b < a ? a : b; } template<typename RT, typename T1, typename T2> RT overMax(T1 a, T2 b) { std::cout << __FUNCSIG__ << std::endl; return b < a …

4
Почему std :: function не участвует в разрешении перегрузки?
Я знаю, что следующий код не скомпилируется. void baz(int i) { } void baz() { } class Bar { std::function<void()> bazFn; public: Bar(std::function<void()> fun = baz) : bazFn(fun){} }; int main(int argc, char **argv) { Bar b; return 0; } Потому std::functionчто сказано не учитывать разрешение перегрузки, как я читал …

1
Правильно ли Clang отклонять код, в котором вложенный класс шаблона класса определяется только через специализации?
Дан следующий шаблон класса: template<typename T> struct Outer { struct Inner; auto f(Inner) -> void; }; мы определяем Innerотдельно для каждой специализации Outer: template<> struct Outer<int>::Inner {}; template<> struct Outer<double>::Inner {}; а затем определить функцию-член fодин раз для всех специализаций Outer: auto Outer<T>::f(Inner) -> void { } но Кланг (9.0.0) …

2
Неоднозначные шаблоны перегрузки
У меня есть следующий шаблонный код #include <vector> #include <array> #include <iostream> template<typename T1> void foo(std::vector<T1> bar) { std::cout << "GENERIC" << std::endl; } template<typename T1> void foo(std::vector<std::vector<T1>> bar) { std::cout << "SPECIFIC (vector)" << std::endl; } template<typename T1, int SIZE> void foo(std::vector<std::array<T1, SIZE>> bar) { std::cout << "SPECIFIC (array)" …
16 c++  templates 

2
Как передать ссылку на аргумент 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)> foo1(a); …
16 c++  templates 

3
Variadic шаблоны: раскрыть аргументы в группах
У меня есть функция, которая принимает два аргумента: template <typename T1, typename T2> void foo(T1 arg1, T2 arg2) { std::cout << arg1 << " + " << arg2 << '\n'; } И переменный, который должен передавать свои аргументы в парах: template <typename... Args> void bar(Args&&... args) { static_assert(sizeof...(Args) % 2 …

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