| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > передача параметров функции в шаблон в c++11 |
| Автор: Ivan. 6.9.2012, 14:31 | ||
| Здравствуйте, вопрос в следующем: Почему нельзя передать параметры функции в качестве аргументов шаблона, если эта функция constexpr Пример:
Почему List... не является константой, если вся функция constexpr? |
| Автор: bsa 6.9.2012, 15:21 |
| Замени 'static const int v = 0;' на enum { v = 0 }; |
| Автор: Ivan. 6.9.2012, 17:44 |
| дело не в static const - это я просто упростил пример, на самом деле там идет рекурсивный темплейт. он не может передать входные параметры в качестве параметров темплейта. он пишет: 'List#1' is not a constant expression. в функцию можно передать все что угодно, в том числе и в рантайме и строить на этом этапе темплейт уже поздно. но я помечаю, что вся функция является константой и должна выполняться на этапе компиляции, но компилятор этого не понимает. я и хочу спросить, как можно объяснить компилятору, что входные параметры являются константами? |
| Автор: boostcoder 6.9.2012, 17:55 |
| покажи компилябельный код воспроизводящий ошибку. |
| Автор: Ivan. 6.9.2012, 18:22 | ||
задача в следующем: есть такой шаблонный класс битов типа TSet, на основе его создаются классы перечня ошибок и др. он естественно имеет всякие методы. так вот, мне нужно создать объект типа TError с какими то предустановленными битами, указанными в конструкторе. вот этот конструктор я и пытаюсь написать. шаблон _SFlags объединяет биты на основе списка аргументов и сохраняет их в статическую переменную. конструктор класса SFlags сохраняет в поле Flags значение v шаблона _SFlags передавая туда входные аргументы конструктора. Конструктор SFlags обязательно должен быть constexpr, чтобы разместить данные в кодовой памяти при компиляции. |
| Автор: boostcoder 6.9.2012, 18:49 |
| это не совсем то, чего я ожидал. добавь main(), добавь пример использования... Добавлено через 1 минуту и 8 секунд и кто такие eBreakSensor2, eMaxTemperature ? как этот код может называться компилябельным? |
| Автор: Ivan. 6.9.2012, 19:03 | ||
| я пишу системы автоматического управления различных протекающих процессов в основном для контроллеров. eBreakSensor1, eBreakSensor2, wMinPressure, eMaxTemperature - это перечень каких либо флагов, в частности аварий и предупреждений в системе. eBreakSensor1 - обрыв датчика 1; eBreakSensor2 - обрыв датчика 2; wMinPressure - предупреждение минимального давления; eMaxTemperature - авария по максимальной температуре; eCOUNT - число флагов в енуме.
Добавлено @ 19:11 забыл, еще есть такая переменная текущих флагов ошибок: TError Errors; куда помещаются текущее состояние системы. я не буду описывать всю систему, откуда они берутся и как туда попадают |
| Автор: Ivan. 6.9.2012, 20:18 | ||
решил!!! заменил рекурсивную структуру на рекурсивную функцию:
Вывод: в шаблон можно загонять только типы, и чистые данные базовых типов и енумов без каких либо преобразований (int)Value, где Value является long, и значений, возвращаемых какими либо функциями, даже если они constexpr. |
| Автор: Ivan. 7.9.2012, 10:07 | ||||||
| Беда. получилась следующая аказия: в классе появился конструктор с неопределенным числом неопределенного типа аргументов. Задача. необходимо создать копию объекта, что мы делаем:
Что делает компилятор: - видит доступный конструктор с неограниченным числом аргументов - тип подходит, количество аргументов тоже; - входит в него; - встречает операцию 1LL << Value, где Value является типом TError; - пытается его к чему нибуть преобразовать, чтобы получить число; - встречает оператор bool() - пойдет; - в итоге вместо копии происходит инициализация массива битов установкой первого бита. Выход: создать конструктор копии
это все хорошо, но что делать, если поле Flags не long long, а массив char?
Копировать через цикл - не хорошо. Вопрос, как можно проинициализировать массив? |
| Автор: bsa 7.9.2012, 12:21 | ||
в С++11 кажется есть возможность использовать дефолтовый конструктор:
|