У меня есть класс C ++, который выполняется в чувствительном ко времени коде, поэтому простое создание объекта может занять больше времени, чем пользователи могут потратить.Я хотел бы определить как стандартную, так и тривиально конструируемую версию моего класса, и позволить пользователям класса контролировать, какая версия класса создается с помощью флага компилятора.Я бы хотел, чтобы флаг компилятора работал на уровне group
.Например, если бы флаг был LEVEL=:OFF,GROUP1:ON
, то тривиальная версия была бы построена для всех экземпляров класса, кроме тех, что в GROUP1
, что позволило бы получить фактическую, нетривиальную реализацию.Цель состоит в том, чтобы пользователи могли отключать определенные группы во время компиляции, изменяя значение флага.
Я бы хотел использовать std::conditional
в C ++ 11 для управления тем, какая версия класса используется.Для этого мне нужно проверить группу, с которой связано данное использование класса, и сравнить ее с настройкой флага компилятора для этой группы.Я не могу придумать, как пользователи этого класса передают настройку времени компиляции в определение основного класса из исходного файла пользователя.Я мог бы потребовать, чтобы пользователи добавили что-то вроде #define MYCLASS_GROUP ON
в свой исходный файл, но я не думаю, что смогу сослаться на это в файле, где определен мой класс.
Есть ли способ для пользователей класса управлять скомпилированной версией класса из исходного файла пользователя?Заранее спасибо за любые идеи здесь!
Обновление: вот как я бы идеально хотел, чтобы это использовалось.Пользователь может сделать:
#define MYCLASS_GROUP GROUP1
MyClass myClassInstance;
Затем он может контролировать, какая версия создается с помощью флага компилятора.Так что -DMYCLASS_GROUP_LEVEL=:OFF,GROUP1:ON
включит варианты использования, подобные описанным выше, в GROUP1
.
В определении класса я хотел бы что-то вроде следующего нерабочего псевдокода:
class MyClassOn {
non-trivial code here
};
class MyClassOff {
};
typedef std::conditional<check-group-here, MyClassOn, MyClassOff>::type MyClass;