В 64-разрядных системах x64 ключ:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
Большинство программ перечислено там. Посмотрите на ключи: DisplayName
DisplayVersion
Примечание, что последнее не всегда устанавливается!
В 64-разрядных системах x86 ключ (обычно с большим количеством записей):
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
Из раздела 13.4 / 1 («Адрес перегруженная функция, "[over.over]):
Использование имени перегруженной функции без аргументов разрешается в определенных контекстах функции, указатель на функцию или указатель на функцию-член для конкретной функции из набора перегрузки. Имя шаблона функции считается именем набора перегруженных функций в таких контекстах. Выбранная функция - это та, тип которой соответствует целевому типу, требуемому в контексте. Целью может быть
- инициализируемый объект или ссылка (8.5, 8.5.3),
- левая часть назначения (5.17),
- параметр функции (5.2.2),
- ] параметр определяемого пользователем оператора (13.5),
- возвращаемое значение функции, операторной функции или преобразования (6.6.3) или
- явное преобразование типа (5.2.3, 5.2.9 , 5.4).
Перед именем функции перегрузки может стоять оператор
&
. Имя перегруженной функции не должно использоваться без аргументов в контекстах, отличных от перечисленных. [ Примечание: Любой избыточный набор скобок, окружающий имя перегруженной функции, игнорируется (5.1). ]
Цель , которая, как вы надеялись, будет выбрана из приведенного выше списка, была первой, инициализируемый объект. Но на пути есть условный оператор, и условные операторы определяют свои типы по своим операндам, а не по какому-либо целевому типу.
Поскольку явные преобразования типов включены в список целей, вы можете приводить к типу каждое выражение указателя-члена в условном выражении отдельно. Сначала я бы сделал typedef:
typedef void (Foo::* float_func)(const float);
float_func func = (someCondition ? float_func(&Foo::X) : float_func(&Foo::Y));
Пример:
class Foo {
public:
void X(float x) {}
void Y(float y) {}
float X() const;
};
typedef void (Foo::*Fff)(float);
Fff func = &Foo::X;
Fff func2 = true ? (Fff)&Foo::X : (Fff)&Foo::Y;
int main(){
return 0;
}
Вам необходимо немедленно привести & Foo :: X, чтобы устранить перегрузку. Обратите внимание: если вы закомментируете перегруженный float X (), вам не нужно этого делать.
Похоже, компилятор недостаточно умен, чтобы вывести требуемый тип возвращаемого значения троичного выражения (это может быть ошибка).
Вам действительно нужно использовать DTO? У вас не было бы этой проблемы, если бы вы передавали реальную сущность, и вам не пришлось бы загружать сущность снова, что не совсем хорошо для производительности.
Но даже если у вас есть законная причина для использования DTO, я не совсем понимаю, почему вы пытаетесь обновить номер версии на своем только что перезагруженном объекте перед сохранением. Рассмотрим различные сценарии, возможные в вашем рабочем процессе:
Теперь у вас есть две возможности: