C ++ включает полезные общие функции, такие как std::for_each
и std::transform
, что может быть очень удобно. К сожалению, они также могут быть довольно громоздкими в использовании, особенно если functor , который вы хотите применить, уникален для конкретной функции.
#include
#include
namespace {
struct f {
void operator()(int) {
// do something
}
};
}
void func(std::vector& v) {
f f;
std::for_each(v.begin(), v.end(), f);
}
Если вы используете только f
один раз и в этом конкретном месте кажется излишним писать целый класс, просто чтобы сделать что-то тривиальное и одно.
В C ++ 03 у вас может возникнуть соблазн написать что-то вроде следующего, чтобы сохранить functor local:
void func2(std::vector& v) {
struct {
void operator()(int) {
// do something
}
} f;
std::for_each(v.begin(), v.end(), f);
}
однако это недопустимо, f
не может быть передано функции template в C ++ 03.
C ++ 11 вводит lambdas, чтобы вы могли написать встроенный анонимный функтор для замены struct f
. Для небольших простых примеров это может быть более чистым для чтения (он хранит все в одном месте) и потенциально проще поддерживать, например, в простейшей форме:
void func3(std::vector& v) {
std::for_each(v.begin(), v.end(), [](int) { /* do something here*/ });
}
Лямбда-функции - это просто синтаксический сахар для анонимных функторов .
В простых случаях для вас выводится тип возврата лямбда, например:
void func4(std::vector& v) {
std::transform(v.begin(), v.end(), v.begin(),
[](double d) { return d < 0.00001 ? 0 : d; }
);
}
, однако, когда вы начинаете писать больше сложный lambdas, вы быстро столкнетесь с случаями, когда тип возврата не может быть выведен компилятором, например:
void func4(std::vector& v) {
std::transform(v.begin(), v.end(), v.begin(),
[](double d) {
if (d < 0.0001) {
return 0;
} else {
return d;
}
});
}
Чтобы разрешить это, вам разрешено явно указывать тип возврата для лямбда-функции, используя -> T
:
void func4(std::vector& v) {
std::transform(v.begin(), v.end(), v.begin(),
[](double d) -> double {
if (d < 0.0001) {
return 0;
} else {
return d;
}
});
}
До сих пор мы не использовали ничего, кроме того, что было передано лямбда внутри него, но мы также можем использовать другие переменные, в пределах лямбда. Если вы хотите получить доступ к другим переменным, вы можете использовать предложение capture ([]
выражения), которое до сих пор не использовалось в этих примерах, например:
void func5(std::vector& v, const double& epsilon) {
std::transform(v.begin(), v.end(), v.begin(),
[epsilon](double d) -> double {
if (d < epsilon) {
return 0;
} else {
return d;
}
});
}
Вы можете выполнять захват обоими ссылку и значение, которые вы можете указать с помощью &
и =
соответственно:
[&epsilon]
захват по ссылке [&]
захватывает все переменные, используемые в lambda по ссылке [=]
фиксирует все переменные, используемые в лямбда по значению [&, epsilon]
захватывает переменные, такие как [& amp;], но epsilon по значению [=, &epsilon]
захватывает переменные, такие как [=], но epsilon по ссылке Порожденный operator()
по умолчанию const
, с импликацией, которая захватывает, будет const
когда вы обращаетесь к ним по умолчанию. Это приводит к тому, что каждый вызов с одним и тем же входом даст тот же результат, однако вы можете пометить лямбда как mutable
, чтобы запросить, что созданный operator()
не const
.
wxWidgets не встроен в применимые библиотеки, когда Вы "устанавливаете" wxMSW установщик. Это вызвано тем, что существует столько настраиваемых элементов, который является точно, для чего setup.h, к которому Вы обращаетесь.
, Если Вы просто хотите создать его с опциями по умолчанию как можно быстрее и движением, вот то, как:
Запускают "Командную строку Visual Studio". Вы найдете это в меню "Пуск" под "Microsoft Visual Studio-> Инструменты Visual Studio".
Изменение в папке: [Корень WXWIN] настройка отладочного процесса значения по умолчанию Сборки \build\msw
: nmake -f makefile.vc BUILD=debug
значение по умолчанию Сборки выпускают конфигурацию: nmake -f makefile.vc BUILD=release
Удостоверяются, что DLLs находятся в Вашем ПУТИ. Они будут найдены в [корень WXWIN] \lib\vc_dll
Под упомянутой выше папкой DLL, Вы найдете подпапки для каждого варианта сборки (Инструкции выше сделали два, отладка и выпуск.) В каждой различной папке Вы найдете 'wx' папку, содержащую 'setup.h" файл. Вы будете видеть, что setup.h файлы на самом деле отличаются для каждого варианта сборки. Это папки, которые необходимо добавить к конфигурации сборки проекта, включают путь, один на вариант сборки. Так, например, Вы добавили бы [корень WXWIN] \lib\vc_dll\mswud к включать пути для Вашей отладочной сборки, [корень WXWIN] \lib\vc_dll\mswu для Вашей сборки конечных версий.
возможно создать много других различных комбинаций: статичный освобождает, монолитная единственная библиотека, не-Unicode, и т.д. Посмотрите [корень WXWIN] \docs\msw\install.txt для намного более обширных инструкций.
Когда Вы загружаетесь с живого CD, нажимают и удерживают левое Сдвиг ключ. Это, выбрав язык, введет меню Grub:
F6 Нажатия в его экране и выборе "nomodeset" как параметр загрузки для предотвращения загрузки видеодрайверов во время начальной загрузки.
, Если это не решает, проблема пробует альтернативный CD для основанной на тексте установки.
В случае, если Вы не сможете загрузиться в графический рабочий стол, можно попытаться установить графические драйверы Nvidia от терминала, например, с текст жокея .
Дополнительное примечание из комментария: после успешной установки мы можем загружаться к "Режим Восстановления" (снова содержат оставленный Сдвиг ключ для меню Grub) устанавливать графические драйверы, или если это приводит спад к сбою до оболочки для продолжения установки драйвера из командной строки.
Вероятно, необходимо создать wxWidgets. Существует шаг постсборки в wxWidgets процессе сборки, который копирует соответствующий setup.h в C:\wxWidgets_install_dir\include\wx.
Нажатие любой ключ перед экраном приветствия установки Ubuntu (для открытия "Ubuntu CD Усовершенствованные Опции Страницы приветствия" .
Нажимают F6 и выбирают опция nomodeset и заканчивают установку.
Содержат сдвиг ключ при начальной загрузке от новой установки (для доступа к опциям GRUB) и выбирают режим восстановления в опциях GRUB.
Используя режим восстановления, включите доступ в Интернет и откройте корневую консоль для выполнения, это управляет:
sudo add-apt-repository ppa:ubuntu-x-swat/x-updates sudo apt-get update sudo apt-get install nvidia-current exit
Вы говорите CD.. 12.04 не будет соответствовать на CD. Где и как Вы делали свой диск установки? Если это - загруженная попытка ISO, записывающая его к DVD. Средство записи CD Windows, как известно, является багги.