Я пытаюсь оптимизировать некоторые функции во время компиляции, используя класс enum в качестве параметра шаблона.
Скажем, например,
enum class Color { RED, BLACK };
Теперь я хотел бы определить метод
void myMethod<Color c> () {
if( c == Color::RED ) { ... }
if( c == Color::BLACK ) { ... }
}
И я бы хотел, чтобы компилятор сделал 2 копии myMethod
и удалил мертвый код во время оптимизации (это для ядер CUDA, поэтому для меня важна скорость и использование регистров)
Однако, похоже, что когда я вызываю метод, используя
void doSomething( const Color c ) {
myMethod<c>();
}
MSV C, жалуется на то, что «выражение должно иметь постоянное значение». Я ожидал, что компилятор будет достаточно умен, чтобы скомпилировать версию myMethod
с каждой возможной версией перечисления. Разве это не так? Могу ли я заставить его без безобразного переключателя в doSomething
?
Спасибо за помощь!