Ничего себе, я не могу верить, как может, люди не потрудились читать вопрос.
Так или иначе, это - то, что я делаю.
Удостоверяются, что Вы не совместно используете объекты между двумя потоками. Как только Ваш поток GUI прикрепляет сообщение в Очередь, поток GUI больше не владеет сообщением. Это не может содержать ссылку на сообщение, или Вы вовлечете себя в проблему.
Это не даст Вам самую лучшую производительность, но это будет достаточно хорошо для большинства приложений. И что еще более важно, это сделает его намного тяжелее, чтобы сделать ошибку.
ОБНОВЛЕНИЕ: не используйте SyncLock и Очередь. Вместо этого используйте ConcurrentQueue, который обработает любую блокировку автоматически для Вас. Вы получите лучшую производительность и, менее вероятно, сделаете ошибку.
Нет. C ++ не имеет такой возможности.
Как упоминалось в других ответах, общие обходные пути:
Нет, в C ++ это невозможно.
Если вы хотите добиться чего-то подобного, у вас есть 2 варианта,
Я предпочитаю подход делегирования.
Generally not. However, if the library does not create instances of the class that require your extension and you are able to modify all places in the app that create an instance of the class and require your extensions, there is a way you can go:
Example:
class derivedClass: public originalClass { /* ... */};
originalClass* createOriginalClassInstance()
{
return new derivedClass();
}
This is roughly how to implement the "inherit" method suggested by Glen. Glen's "wrapper class with same interface" method is also very nice from a theoretical point of view, but has slightly different properties that makes it less probable to work in your case.
Методы расширения класса C # в основном являются синтаксическим сахаром. Вы получаете ту же функциональность, что и бесплатные функции (т. Е. Функции со ссылкой или постоянной ссылкой на ваш класс в качестве первого параметра). Так как это хорошо работает для STL, почему не для вашего класса?
Извините, нет. Как только ваш код находится в obj, вы не можете его изменить. Если это можно сделать в VC, частичные классы уже будут поддерживаться. Однако есть одно исключение: методы операторов могут быть расширены с помощью глобальных функций, подобно тому, как cout << реализован в STL.
Конечно, можно:
template <typename Ext>
class Class: public Ext { /* ... */ };
Это не значит, что это лучший подход.
Есть один способ, которым это можно сделать. И это немного ослабит ваши требования. В C ++ люди часто говорят, что интерфейс класса состоит не только из его функций-членов, но и из всех функций, которые работают с классом .
То есть, функции, не являющиеся членами, которые могут быть заданы класс как параметр следует рассматривать как часть его интерфейса.
Например, std :: find ()
или std :: sort ()
являются частью интерфейса std :: vector
, даже если они не являются членами класса.
И если вы принимаете это определение, вы всегда можете расширить класс, просто добавив функции, не являющиеся членами класса.