Я нахожусь в поиске функции :: std ::, пригодной для использования в constexpr.Случай использования: у меня есть функция, которая принимает указатель на функцию в качестве аргумента, и вторая, которая передает лямбда-функцию первой функции.Оба полностью исполняются во время компиляции, поэтому я хочу их объединить.Например:
template <class _Type>
class ConstexprFunctionPtr
{
private:
using Type = typename ::std::decay<_Type>::type;
const Type function;
public:
constexpr inline
ConstexprFunctionPtr(const Type f)
: function(f)
{ }
template <typename... Types>
constexpr inline
auto
operator() (Types... args)
const {
return function(args... );
}
};
constexpr inline
void
test()
{
ConstexprFunctionPtr<int(int)> test([](int i) -> int {
return i + 1;
});
int i = test(100);
ConstexprFunctionPtr<int(int)> test2([=](int i) -> int {
return i + 1;
});
i = test2(1000);
}
Однако это работает только потому, что я преобразовываю лямбду в указатель функции, и, конечно, не удается захватить лямбда-выражения, как показано во втором примере.Кто-нибудь может дать мне несколько советов о том, как сделать это с захватом лямбд?
Это продемонстрировало бы случай использования:
constexpr
void
walkOverObjects(ObjectList d, ConstexprFunctionPtr<void(Object)> fun) {
// for i in d, execute fun
}
constexpr
void
searchObjectX(ObjectList d) {
walkOverObjects(d, /*lambda that searches X*/);
}
Спасибо, Джек