Запитання з тегом «template-meta-programming»

27
Запропоновано перевірити наявність функції члена класу?
Чи можна написати шаблон, який змінює поведінку залежно від того, чи визначена певна функція члена в класі? Ось простий приклад того, що я хотів би написати: template<class T> std::string optionalToString(T* obj) { if (FUNCTION_EXISTS(T->toString)) return obj->toString(); else return "toString not defined"; } Отже, якщо class Tвін toString()визначив, то він його …

20
Як можна повторити елементи std :: tuple?
Як я можу повторити кортеж (за допомогою C ++ 11)? Я спробував таке: for(int i=0; i<std::tuple_size<T...>::value; ++i) std::get<i>(my_tuple).do_sth(); але це не працює: Помилка 1: вибачте, не виконане: не можна розширити "Слухач ..." у список аргументів фіксованої довжини. Помилка 2: я не можу відображатися в постійному виразі. Отже, як я правильно …

15
Шаблони C ++ - Turing-complete?
Мені кажуть, що система шаблонів у C ++ завершується Тьюрінгом під час компіляції. Про це йдеться у цій публікації, а також у вікіпедії . Чи можете ви надати нетривіальний приклад обчислення, що експлуатує цю властивість? Чи корисний цей факт на практиці?

1
більше духовного божевілля - типи парсерів (правила проти int_parser <>) та методи метапрограмування
Питання напівжирним шрифтом внизу, проблема також узагальнена фрагментом коду перегонки до кінця. Я намагаюся об'єднати мою систему типів (система типів робить це і від типу до рядка) в один компонент (як визначено Лакосом). Я використовую boost::array, boost::variantі boost::mpl, для цього. Я хочу, щоб правила синтаксичного аналізу та генератора для моїх …

5
Як зробити загальні обчислення за неоднорідними пакетами аргументів варіадичної функції шаблону?
ПРОМІСЛЯ: Трохи погравши з варіативними шаблонами, я зрозумів, що досягнення всього, що трохи виходить за межі тривіальних завдань метапрограмування, незабаром стає досить громіздким. Зокрема, я виявив , бажаючи таким чином , щоб виконувати загальні операції над аргументом пакета , такі як ітерації , розкол , петлі в std::for_each-like моди, і …

3
Як я можу отримати глибину багатовимірного std :: вектора під час компіляції?
У мене є функція, яка займає багатовимірність std::vectorі вимагає передавати глибину (або кількість розмірів) як параметр шаблону. Замість жорсткого кодування цього значення я хотів би написати constexprфункцію, яка буде приймати std::vectorі повертати глибину як unsigned integerзначення. Наприклад: std::vector&lt;std::vector&lt;std::vector&lt;int&gt;&gt;&gt; v = { { { 0, 1}, { 2, 3 } }, …

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

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

1
Законно ініціалізувати масив у конструкторі constexpr?
Чи законний наступний код? template &lt;int N&gt; class foo { public: constexpr foo() { for (int i = 0; i &lt; N; ++i) { v_[i] = i; } } private: int v_[N]; }; constexpr foo&lt;5&gt; bar; Кланг приймає це, але GCC та MSVC відкидають це. Помилка GCC: main.cpp:15:18: error: 'constexpr …
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.