std::any позволяет сохранить в себя объект любого типа, после чего через any_cast вытащить значение, если оно такого типа, как мы предполагаем. Проверка осуществляется через RTTI. Если поддерживается много конкретных типов, вы должны писать здоровенную цепочку if-else-if. В таком случае лучше уж идти через наследование.
namespace what {
#define apples 2
}
namespace stuff {
class foo {
private:
int apples = 3; // ОШИБКА: 2 - недопустимое имя
public:
int read_apples() {
return apples; // 2
}
};
}constexpr константами или inline функциями. А там, где они необходимы, давайте им длинные страшные КРИЧАЩИЕ_ИМЕНА.
std::vector<std::vector<std::string>>. Каждый внутренний вектор хранит варианты выбора для очередного куска строки. В частности, для кусков строки между вариативными частями будем считать, что есть всего 1 вариант выбора. Соответственно, весь вектор векторов — это последовательность таких вариативных частей. Задача делится на 2 части:std::string для текущего варианта и std::vector<std::string> для текущей вариативной части.std::string, и накидываем туда из каждого внутреннего вектора по 1 варианту.
Cls::Cls(char c, double d, int i)
: c(c), d(d), i(i) {}
std::string использует SBO, то есть не выделяет доп. память в куче для коротких строк. Ещё стандартные мапы в C++ крайне неэффективны, подключите библиотеку. Идея такова:
IdentifyLength, а не на typedef. К слову, в новом коде вместо typedef следует использовать using:using DigitArea = unsigned int;<cstdint> по умолчанию. Например:using DigitArea = std::int64_t;
#include "std_lib_facilities.h"std_lib_facilities.h и подключили его должным образом?
template <typename T>
class hashed {
T value_;
size_t hash_;
friend class std::hash<hashed<T>>;
public:
template <typename... Args>
constexpr hashed(Args&&... args) :
value_(std::forward<Args>(args)...),
hash_(std::hash<T>()(value_))
{}
// rule of zero
constexpr T& get() & noexcept { return value_; }
constexpr const T& get() const& noexcept { return value_; }
constexpr T&& get() && noexcept { return value_; }
constexpr const T&& get() const&& noexcept { return value_; }
};
namespace std {
template <typename T>
struct hash<hashed<T>> {
constexpr size_t operator()(const hashed<T>& x) const noexcept {
return x.hash_;
}
};
}
std::unordered_map<hashed<std::string>, int> cache;
auto it = cache.find("property1"); // хеш на этапе выполнения
// хеш на этапе компиляции, работает с constexpr std::string из C++20
constexpr auto h = hashed<std::string>("property1");
auto it2 = cache.find(h); // предрасчитанный хеш
enum Foo {
case qqq(Int)
case www(Int)
}
let x = Foo.qqq(5)
let y = Foo.www(10)class Foo {
public:
virtual ~Foo() = 0;
};
class qqq : public Foo {
public:
int value;
explicit qqq(int value);
};
class www : public Foo {
public:
int value;
explicit www(int value);
};
using FooPtr = std::unique_ptr<Foo>;
FooPtr makeQqq(int value);
FooPtr makeWww(int value);
FooPtr x = makeQqq(5);
FooPtr y = makeWww(10);type_safe (кликабельно).#include <type_safe/strong_typedef.hpp>
#include <type_safe/variant.hpp>
namespace ts = type_safe;
using qqq = ts::strong_typedef<int>;
using www = ts::strong_typedef<int>;
using Foo = ts::variant<qqq, www>;
// ...
auto x = Foo(qqq(5));
auto y = Foo(www(10));
if (x.has_value(ts::variant_type<qqq>{})) {
qqq value = x.value(ts::variant_type<qqq>{}));
std::cout << "qqq" << ' ' << static_cast<int>(value);
}
fmt::print("Total: [{}]\n", fmt::join(total_1.begin(), total_1.end(), ", "));
//=> Total: [1, 2, 3]Может, кто-то ещё переметнётся на сторону printf-стиля :]
<random>:// Важно: создание этого объекта занимает некоторое время,
// его лучше использовать для генерации всех случайный чисел
std::default_random_engine engine(std::random_device()());
// Легковесный объект-диапазон для генерации целых чисел
// В std есть и куча других полезных распределений
std::uniform_int_distribution<int> distribution(min,max);
for (int i = 0; i < N; ++i) {
int random_number = distrubution(engine);
std::cout << random_number << std::endl;
}
std::list из хедеров VS2003 в свой хедер my_list.hstd::list в класс (не std) my_listmy_list вместо std::list при работе с библиотекойstd::list&, то при вызове функции можно передавать reinterpret_cast<std::list&>(my_list_instance), чтобы пропихнуть тот список,
#include <math.h>, в C++ нужно использовать #include <cmath>. Она более производительна в некоторых случаях, и там есть больше функций для C++.int, если всё равно вычисляем double? Тогда программа не сойдёт с ума при больших координатах.x*x можно использовать pow(x,2) без потери производительности.#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
double x1, x2, y1, y2;
cin >> x1 >> x2 >> y1 >> y2;
cout << fixed << setprecision(2) << sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
return 0;
}