троичный оператор не работает с лямбда-функциями

Я назначаю на std::function<double()> лямбда-выражение. Этот фрагмент работает

if(fn_type==exponential)
k.*variable = [=,&k](){ return initial*exp(-k.kstep*par); };
else
k.*variable = [=,&k](){ return initial*pow(k.kstep, par); };

тогда как, если я хочу использовать троичный оператор

k.*variable = (fn_type==exponential ? [=,&k](){ return initial*exp(-k.kstep*par); } : [=,&k](){ return initial*pow(k.kstep, par); });

Я получаю следующую ошибку:

error: no match for ternary ‘operator?:’ in <awfully long template error, because this whole thing is in a class defined in a function...>

Это ошибка GCC (я использую 4.7.2)? Иначе, почему в стандарте этот предел?

13

Решение

Второй и третий операнды условного оператора должны иметь один и тот же тип, или должен существовать какой-то общий тип, в который они оба могут быть преобразованы, и компилятор может их определить. Компилятор рассмотрит лишь несколько преобразований.

Ваши два лямбда-выражения имеют разные типы, и нет общего типа, в который они оба могут быть преобразованы (преобразования в определяемые пользователем типы, например std::function<double()>, не может быть рассмотрено, потому что потенциально существует бесконечное число допустимых целевых типов).

Вы можете напрямую преобразовать каждый из операндов в std::function<double()>:

k.*variable = fn_type==exponential
? std::function<double()>([=,&k](){ return initial*exp(-k.kstep*par); })
: std::function<double()>([=,&k](){ return initial*pow(k.kstep, par); });

Но на самом деле, это чище с if/else,

19

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector