Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Inline namespace
Inline namespace – это механизм, обеспечивающий поддержку развития библиотек, путем предоставления механизма версионирования. Рассмотрим пример: // file V99.h: inline namespace V99 { void f(int); // лучше, нежели версия V98 void f(double); // новая возможность //... } // file V98.h: namespace V98 { void f(int); // что-то делает //... } // file Mine.h: namespace Mine { #include " V99.h" #include " V98.h" }
Суть в том, что спецификатор inline заставляет объявления во вложенном пространстве имен вести себя так, как будто они объявлены в текущем. Это поведение очень «статичное» и ориентировано на разработчика библиотеки, поскольку спецификатор inline указывается поставщиком пространства имен, принимая при этом решение за пользователя. Пользователь Mine никак не может указать, что он хочет по умолчанию использовать V98 вместо V99. См.:
Операторы явного преобразования В С++98 существуют явные и неявные конструкторы; преобразования, определенные с помощью конструктора со спецификатором explicit могут использоваться только при явном преобразовании, в то время, как другие конструкторы могут использоваться также и в неявных преобразованиях. Например: // " обычный конструктор" определяет неявное преобразование struct S { S(int); }; S s1(1); // ok S s2 = 1; // ok Void f(S); f(1); // ok (но это может привести к неприятным // сюрпризам, что если S – это вектор?) struct E { explicit E(int); }; // явный конструктор E e1(1); // ok E e2 = 1; // ошибка (хотя это обычно является сюрпризом) Void f(E); f(1); // ошибка (защищает от сюрпризов – например, // конструктор std:: vector, принимающий int является явным)
Однако конструктор является не единственным механизмом определения преобразования. Если мы не можем изменить класс, мы можем определить оператор преобразования из другого класса. Например: struct S { S(int) { } /*... */ }; struct SS { Int m; SS(int x): m(x) { } // поскольку S не содержит конструктор S(SS) operator S() { return S(m); } }; SS ss(1); S s1 = ss; // ok; аналогично неявному конструктору S s2(ss); // ok; аналогично неявному конструктору Void f(S); f(ss); // ok; аналогично явному конструктору
К сожалению, не существует явных (explicit) операторов преобразования (поскольку количество примеров, когда это приводит к неприятностям, значительно меньше). В С++11 этот недосмотр учтен и явные операторы преобразования добавлены в язык. Например: struct S { S(int) { } }; struct SS { Int m; SS(int x): m(x) { } // поскольку S не содержит конструктор S(SS) explicit operator S() { return S(m); } }; SS ss(1); S s1 = ss; // ошибка; как и в случае явного конструктора S s2(ss); // ok; как и в случае явного конструктора
|