#include <iostream>
#define CHECK_EQ(a, b) \
do{ \
if ((a) != (b)){ \
std::cout << "Values are not equal: \"" << a << "\" != \"" << b << "\"" << std::endl \
<< "\tleft expression: \"" << #a << "\"\n\tright expression: \"" << #b << "\"" << std::endl \
<< "\tin \"" << __FILE__ << ":" << __LINE__ << "\"" <<std::endl; \
} \
}while(0)
// while(0) для того, чтобы поставить ; после макроса.
int main()
{
int a = 1;
for(int i = 0; i < 3; ++i){
CHECK_EQ(a + 1, i);
}
}
Values are not equal: "2" != "0"
left expression: "a + 1"
right expression: "i"
in "<...>:17"
Values are not equal: "2" != "1"
left expression: "a + 1"
right expression: "i"
in "<...>:17"
#include <string>
// Синглтон Майерса. Переменная str будет создана один раз при первом вызове getPrefix, начиная с c++11 это ещё и потокобезопастно.
const std::string& getPrefix(){
static std::string str {"pref::"}; // Инициализация должна быть в конструкторе.
return str;
}
// Его использование.
std::string addPrefix(const std::string& str){
return getPrefix() + str;
}
chcp 1251
перед запуском программы. Или можно в реестре поменять кодировку по умолчанию, как тут сделано.class ModuleClass
{
public:
ModuleClass(const char* ModuleGUID);
ModuleClass(std::string ModuleGUID);
std::string GetModuleGUID();
int ProcessTast(TaskClass t);
~ModuleClass() = default; // генерируется автоматически благодаря умным указателям
private:
int Start(TaskClass t);
int Stop();
int Extract();
int SetExec();
int Launch();
int AnswersProcessor();
int ReadingThreadChecker();
std::string ModuleGUID;
std::atomic<bool> isStarted;
std::atomic<bool> stopFlag;
std::unique_ptr<PipeServerClass> pipe;
std::unique_ptr<MessageCollectorClass> msgCollector;
std::unique_ptr<std::thread> AnswerProcessingThread;
std::unique_ptr<std::thread> ReaderCheckingThread;
};
detach
. В любом случае, нужно либо использовать пользовательский deleter для unique_ptr, либо реализовать специальную обертку над потоком. LIBS += C:/qt_projects/-----X-----/boost/1.59.0/libs
лишняя.contains(ANDROID_TARGET_ARCH,x86) {
ANDROID_EXTRA_LIBS += \
L"C:/qt_projects/-----X-----/boost/1.59.0/libs/x86/gnu-5/" \
lboost_atomic \
lboost_chrono \
..........
}
по аналогии со стандартным для qmake добавлением в LIBS (Lпуть - путь к каталогу с либами, lназвание - название библиотеки без lib и .so)// my_plugin_api.hpp
#include <string>
class my_plugin_api {
public:
virtual std::string name() const = 0;
virtual float calculate(float x, float y) = 0;
virtual ~my_plugin_api() {}
};
// my_plugin_sum.cpp
#include <boost/config.hpp> // for BOOST_SYMBOL_EXPORT
#include "../tutorial_common/my_plugin_api.hpp"
namespace my_namespace {
class my_plugin_sum : public my_plugin_api {
public:
my_plugin_sum() {
std::cout << "Constructing my_plugin_sum" << std::endl;
}
std::string name() const {
return "sum";
}
float calculate(float x, float y) {
return x + y;
}
~my_plugin_sum() {
std::cout << "Destructing my_plugin_sum ;o)" << std::endl;
}
};
// Exporting `my_namespace::plugin` variable with alias name `plugin`
// (Has the same effect as `BOOST_DLL_ALIAS(my_namespace::plugin, plugin)`)
extern "C" BOOST_SYMBOL_EXPORT my_plugin_sum plugin;
my_plugin_sum plugin;
} // namespace my_namespace
#include <boost/dll/import.hpp> // for import_alias
#include <iostream>
#include "../tutorial_common/my_plugin_api.hpp"
namespace dll = boost::dll;
int main(int argc, char* argv[]) {
boost::filesystem::path lib_path(argv[1]); // argv[1] contains path to directory with our plugin library
boost::shared_ptr<my_plugin_api> plugin; // variable to hold a pointer to plugin variable
std::cout << "Loading the plugin" << std::endl;
plugin = dll::import<my_plugin_api>( // type of imported symbol is located between `<` and `>`
lib_path / "my_plugin_sum", // path to the library and library name
"plugin", // name of the symbol to import
dll::load_mode::append_decorations // makes `libmy_plugin_sum.so` or `my_plugin_sum.dll` from `my_plugin_sum`
);
std::cout << "plugin->calculate(1.5, 1.5) call: " << plugin->calculate(1.5, 1.5) << std::endl;
}
Loading the plugin
Constructing my_plugin_sum
plugin->calculate(1.5, 1.5) call: 3
Destructing my_plugin_sum ;o)
std::array<int, 3> array = {1, 2, 3};
std::vector<std::string>& getStaticMyVector (){
static std::vector<std::string> staticVector = {"", ""};
return v;
}
std::vector<std::string>& getStaticMyVector (){
auto init = []{
std::vector<std::string> v;
v.push_back(" ");
return v;
};
static std::vector<std::string> staticVector = init();
return v;
}
#include <memory>
template<typename T>
class Stack{
public:
Stack(std::size_t maxSize_): maxSize(maxSize_){}
// Что происходит, когда стек пуст? Можно бросить исключение, или сделать как в std
T pop(){
// if (!tmp) throw ...
auto tmp = std::move(head);
// Обратите внимание, теперь head пуст
head = std::move(tmp->next);
// Теперь tmp->next пуст
--size;
return tmp->value;
}
bool push(T value){
if (size+1 > maxSize)
return false;
// здесь может быть брошено исключение из-за нехватки памяти
std::unique_ptr<Node> tmp(new Node(value));
tmp->next = std::move(head);
head = std::move(tmp);
++size;
return true;
}
private:
struct Node{
T value;
std::unique_ptr<Node> next = nullptr;
Node(T value_) noexcept
: value(value_)
{ }
};
std::unique_ptr<Node> head = nullptr;
std::size_t maxSize;
std::size_t size = 0;
};