Сконфигурировать lambda
От: nen777w  
Дата: 08.02.17 11:44
Оценка:
Есть некая:
boost::function<double(double, double)> fn;
которой нужно присвоить некую функцию, мне бы очень хотелось что бы это была lambda.

(Кстати fn = nullptr — приводит к ошибке компиляции, тогда как fn = NULL компилируется (это лирическое отступление про старый добрый NULL))

Так вот саму lambda, точнее ее тело, мне бы хотелось иметь возможность конфигурировать (из вне) в compile time, т.е. в зависимости от некоторой константы компилятор использует или один кусок кода или другой.

Есть варианты это сделать?
Писать внешние шаблонные функции и использовать bind как то не очень хочется.
Спасибо. Надеюсь объяснил понятно?
Отредактировано 08.02.2017 11:45 nen777w . Предыдущая версия .
Re: Сконфигурировать lambda
От: uzhas Ниоткуда  
Дата: 08.02.17 12:49
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Надеюсь объяснил понятно?


пиши код, выкладывай в онлайн компилятор, мы подрихтуем
Re: Сконфигурировать lambda
От: Muxa  
Дата: 08.02.17 14:46
Оценка:
N>Есть варианты это сделать?
http://ideone.com/I2LyG7
так?

#include <iostream>
#include <boost/function.hpp>
 
using namespace std;
 
int main() {
    boost::function<double(double, double)> fn = [](double x, double y) -> double
    {
        return x + y;
    };
 
    std::cout << fn(1.0, 2.0) << std::endl;
    return 0;
}
Отредактировано 08.02.2017 14:46 Muxa . Предыдущая версия .
Re: Сконфигурировать lambda
От: Chorkov Россия  
Дата: 08.02.17 15:42
Оценка:
Здравствуйте, 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;
Re[2]: Сконфигурировать lambda
От: nen777w  
Дата: 08.02.17 22:47
Оценка:
N>>Так вот саму lambda, точнее ее тело, мне бы хотелось иметь возможность конфигурировать (из вне) в compile time, т.е. в зависимости от некоторой константы компилятор использует или один кусок кода или другой.

А так и я могу.
Ладно сделал уже по другому через внешнюю структуру.
Тему можно сносить.
Re: Сконфигурировать lambda
От: vdimas Россия  
Дата: 12.03.17 14:15
Оценка: +1
Здравствуйте, 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, т.е. в зависимости от некоторой константы компилятор использует или один кусок кода или другой.


Для константы достаточен простой if.

Ну или так:
template<int N>
struct Op;

template<>
struct Op<0> {
  static double fn(double a, double b) { return a+b; }
}

template<>
struct Op<1> {
  static double fn(double a, double b) { return a-b; }
}

enum { NN = 1 };

Fn fn = [](double x, double y) { return Op<NN>::fn(x, y); }
Re[3]: Сконфигурировать lambda
От: Ops Россия  
Дата: 18.03.17 18:30
Оценка:
Здравствуйте, nen777w, Вы писали:

N>>>Так вот саму lambda, точнее ее тело, мне бы хотелось иметь возможность конфигурировать (из вне) в compile time, т.е. в зависимости от некоторой константы компилятор использует или один кусок кода или другой.


N>А так и я могу.


А компилятор-то что генерит, рантайм? По идее, должен соптимизировать, если условие — константа времени компиляции.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: Сконфигурировать lambda
От: MasterZiv СССР  
Дата: 26.03.17 18:37
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Есть некая:

N>boost::function<double(double, double)> fn;
N>которой нужно присвоить некую функцию, мне бы очень хотелось что бы это была lambda.
N>Так вот саму lambda, точнее ее тело, мне бы хотелось иметь возможность конфигурировать (из вне) в compile time, т.е. в зависимости от некоторой константы компилятор использует или один кусок кода или другой.

А с чего вдруг это должна быть лямбда?
Тебе нужны захваты каких-то переменных?
Тебе нужно определение функции по месту ?
Думаю, нет, и поэтому тебе просто нужны несколько проостых обычных функций.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.