Jego głównym zadaniem jest przerobienie istniejącego kodu, wprowadzając nowe mechanizmy ze standardu C++11. Nie jest tego wiele, ale pokazuje, jakie moce drzemią w samym clang-u. Testy przeprowadzałem na wersji 3.5
clang-modernize -add-override \
-loop-convert \
-pass-by-value \
-replace-auto_ptr \
-use-auto \
-use-nullptr \
cpp_modernize.cpp
Niestety nie udało mi się zmusić do działania opcji "pass-by-value", które ma pozwolić na zadziałanie move sementic.#include <iostream>
#include <memory>
#include <vector>
#include <map>
class ICar {
public:
virtual ~ICar() {};
virtual int engine(const std::string& name) = 0;
};
class Car : public ICar {
public:
- virtual int engine(const std::string& name) {
+ virtual int engine(const std::string& name) override {
std::cout << "Engine " << name << " start" << std::endl;
return 44;
}
};
std::vector<std::string> rewrite(const std::map<std::string, int> m) {
std::vector<std::string> out;
- for (std::map<std::string, int>::const_iterator it = m.cbegin(); it != m.cend(); ++it) {
+ for (auto it = m.cbegin(); it != m.cend(); ++it) {
out.push_back(it->first);
}
return out;
}
int main() {
std::map<std::string, int> m = {{"3", 3}, {"4", 4}, {"8", 8}};
std::vector<std::string> v = rewrite(m);
- std::auto_ptr<ICar> ferrari(new Car());
+ std::unique_ptr<ICar> ferrari(new Car());
int oil_counter = 0;
- for (int i = 0; i < v.size(); ++i) {
- if (ferrari.get() != NULL) {
- int result = ferrari->engine(v[i]);
+ for (auto & elem : v) {
+ if (ferrari.get() != nullptr) {
+ int result = ferrari->engine(elem);
oil_counter += result;
}
}
return 0;
}