Могу ли я сказать во время компиляции, допустим ли определенный набор типов ввода для лямбда-выражения Boost.Phoenix?

Допустим, у меня есть лямбда-выражение 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).

2

Решение

Я не думаю, что это возможно в Фениксе, как сегодня. Чтобы поддержать это использование, enable_if Он должен был бы использоваться практически во всех вызовах функций, которые Phoenix выполняет в цепочке вызовов eval, на всех уровнях, даже в других библиотеках, от которых зависит Phoenix. Я знаю, что Phoenix не написан таким образом, и трудно представить, что любое количество взломов кода могло бы сделать это до того, как Phoenix, Proto и все библиотеки, от которых они зависят, будут переписаны на чистом C ++ 11. Даже в этом случае потребуется большая осторожность, чтобы все потенциальные ошибки появлялись в контенте SFINAE.

Я просто не вижу, чтобы это произошло, извини.

1

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

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

По вопросам рекламы [email protected]