Допустим, у меня есть лямбда-выражение Boost.Phoenix, например:
_1 * 4.5 + (3.0 / _2)
Есть хороший способ, чтобы во время компиляции определить, является ли лямбда-выражение допустимым, учитывая список типов, связанных с аргументами _1
, _2
, и так далее? Я думаю, что я хотел бы использовать enable_if
определить, поддерживаются ли типы ввода лямбда-выражением. Если это так, лямбда будет вызываться напрямую, а если нет, то я хочу создать no-op. Псевдокод будет примерно таким:
template <typename F, typename A1, typename A2>
enable_if<F::is_supported<A1, A2>, result_of<F(A1,A2)>::type >::type func(F func, A1 arg1, A2 arg2)
{
func(A1, A2);
}
template <typename F, typename A1, typename A2>
disable_if<F::is_supported<A1, A2> >::type func(F func, A1 arg1, A2 arg2)
{
}
Я просто не знаю как is_supported
будет реализован, или это вообще возможно. Я не использую C ++ 11; Я бы предположил, что только C ++ 03 (так как этого требует Phoenix).
Я не думаю, что это возможно в Фениксе, как сегодня. Чтобы поддержать это использование, enable_if
Он должен был бы использоваться практически во всех вызовах функций, которые Phoenix выполняет в цепочке вызовов eval, на всех уровнях, даже в других библиотеках, от которых зависит Phoenix. Я знаю, что Phoenix не написан таким образом, и трудно представить, что любое количество взломов кода могло бы сделать это до того, как Phoenix, Proto и все библиотеки, от которых они зависят, будут переписаны на чистом C ++ 11. Даже в этом случае потребуется большая осторожность, чтобы все потенциальные ошибки появлялись в контенте SFINAE.
Я просто не вижу, чтобы это произошло, извини.
Других решений пока нет …