Вопросы с тегом «template-meta-programming»

499
Шаблонная проверка на существование функции-члена класса?

Можно ли написать шаблон, который меняет поведение в зависимости от того, определена ли определенная функция-член в классе? Вот простой пример того, что я хотел бы написать: template<class T> std::string optionalToString(T* obj) { if (FUNCTION_EXISTS(T->toString)) return...

113
Как вы можете перебирать элементы std :: tuple?

Как я могу перебирать кортеж (используя C ++ 11)? Я пробовал следующее: for(int i=0; i<std::tuple_size<T...>::value; ++i) std::get<i>(my_tuple).do_sth(); но это не работает: Ошибка 1: извините, не реализовано: невозможно развернуть "Listener ..." в список аргументов фиксированной...

111
Шаблоны C ++ по Тьюрингу?

Мне сказали, что система шаблонов в C ++ является полной по Тьюрингу во время компиляции. Об этом упоминается в этом посте, а также в Википедии. . Можете ли вы привести нетривиальный пример вычисления, использующего это свойство? Полезен ли этот факт на...

45
Как я могу получить глубину многомерного std :: vector во время компиляции?

У меня есть функция, которая принимает многомерный std::vectorи требует, чтобы глубина (или количество измерений) передавалась как параметр шаблона. Вместо жесткого кодирования этого значения я хотел бы написать constexprфункцию, которая будет принимать std::vectorи возвращать глубину как unsigned...

38
Шаблон метапрограммирования

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

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

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

11
Законно ли инициализировать массив в конструкторе constexpr?

Является ли следующий код законным? template <int N> class foo { public: constexpr foo() { for (int i = 0; i < N; ++i) { v_[i] = i; } } private: int v_[N]; }; constexpr foo<5> bar; Clang принимает это, но GCC и MSVC отклоняют это. Ошибка GCC: main.cpp:15:18: error: 'constexpr...