Есть некая:
boost::function<double(double, double)> fn;
которой нужно присвоить некую функцию, мне бы очень хотелось что бы это была lambda.
(Кстати fn = nullptr — приводит к ошибке компиляции, тогда как fn = NULL компилируется (это лирическое отступление про старый добрый NULL))
Так вот саму lambda, точнее ее тело, мне бы хотелось иметь возможность конфигурировать (из вне) в compile time, т.е. в зависимости от некоторой константы компилятор использует или один кусок кода или другой.
Есть варианты это сделать?
Писать внешние шаблонные функции и использовать bind как то не очень хочется.
Спасибо. Надеюсь объяснил понятно?
Здравствуйте, nen777w, Вы писали:
N>Есть некая: N>boost::function<double(double, double)> fn; N>которой нужно присвоить некую функцию, мне бы очень хотелось что бы это была lambda.
N>(Кстати fn = nullptr — приводит к ошибке компиляции, тогда как fn = NULL компилируется (это лирическое отступление про старый добрый NULL))
N>Так вот саму lambda, точнее ее тело, мне бы хотелось иметь возможность конфигурировать (из вне) в compile time, т.е. в зависимости от некоторой константы компилятор использует или один кусок кода или другой.
bool flag = true;
boost::function<double(double,double)> fn;
if(flag)
fn = [](double a, double b) { return a+b; };
else
fn = [](double a, double b) { return a-b; };
std::cout << fn(1, 2) << std::endl;
N>>Так вот саму lambda, точнее ее тело, мне бы хотелось иметь возможность конфигурировать (из вне) в compile time, т.е. в зависимости от некоторой константы компилятор использует или один кусок кода или другой.
А так и я могу.
Ладно сделал уже по другому через внешнюю структуру.
Тему можно сносить.
Здравствуйте, nen777w, Вы писали:
N>(Кстати fn = nullptr — приводит к ошибке компиляции, тогда как fn = NULL компилируется (это лирическое отступление про старый добрый NULL))
Так этого и не требуется.
typedef boost::function<double(double, double)> Fn;
Fn fn;
assert(!fn);
fn = [](double a, double b) { return a+b; }
assert(fn);
fn.clear(); // или fn = Fn();
assert(!fn);
N>Так вот саму lambda, точнее ее тело, мне бы хотелось иметь возможность конфигурировать (из вне) в compile time, т.е. в зависимости от некоторой константы компилятор использует или один кусок кода или другой.
Здравствуйте, nen777w, Вы писали:
N>>>Так вот саму lambda, точнее ее тело, мне бы хотелось иметь возможность конфигурировать (из вне) в compile time, т.е. в зависимости от некоторой константы компилятор использует или один кусок кода или другой.
N>А так и я могу.
А компилятор-то что генерит, рантайм? По идее, должен соптимизировать, если условие — константа времени компиляции.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, nen777w, Вы писали:
N>Есть некая: N>boost::function<double(double, double)> fn; N>которой нужно присвоить некую функцию, мне бы очень хотелось что бы это была lambda. N>Так вот саму lambda, точнее ее тело, мне бы хотелось иметь возможность конфигурировать (из вне) в compile time, т.е. в зависимости от некоторой константы компилятор использует или один кусок кода или другой.
А с чего вдруг это должна быть лямбда?
Тебе нужны захваты каких-то переменных?
Тебе нужно определение функции по месту ?
Думаю, нет, и поэтому тебе просто нужны несколько проостых обычных функций.