Поскольку параметры шаблона могут иметь только указатели на объекты и не допускают лямбда-литералы, я пытался найти способ перехватить лямбда-выражение и передать его как std :: function.Поскольку параметр не может быть простой функцией, я знаю, что это должна быть либо ссылка, либо указатель.Я пробовал и function & = * function_ptr, и function * = & function_ptr, но оба придумали ошибки, касающиеся конверсий.Попытка & и & приводит к ошибке object has no linkage
.Можно ли передать указатель на std :: function?
Вот код, который у меня есть в настоящее время.
template<typename type>
std::function<bool(type)>* d = new std::function<bool(type)>([](type element) constexpr -> bool {return element;});
template<typename type = bool, std::function<bool(type)>& lambda = *d<type>>
struct Boolean {
const type element;
constexpr inline explicit Boolean(type element_in): element(element_in) {}
constexpr inline operator bool() {
return *lambda(element);
}
};
Цель - эффективно передать алгоритм во время компиляции черезпараметры шаблона.Я думал об использовании if constexpr и nullptr по умолчанию, чтобы дать лямбде значение по умолчанию, которое я на самом деле имею для него, но я не понимаю, почему это необходимо.
Чтобы быть явным, я имею в видупробовал:
*lambda = d<type>
, *lambda = &d<type>
, &lambda = &d<type>
и &lambda = *d<type>
.Вероятно, другие в моей схватке, но я вспоминаю это явно.
За ошибки я получил:
* Concepts::Operators::d<bool>’ is not a valid template argument for type ‘std::function<bool(bool)>&’ because it is not an object with linkage
,
и многие о неправильных преобразованиях между указателями и ссылками.
Я надеюсь, что кто-то может объяснить, почему попытка сопоставить указатель с ссылкой, похоже, не работает, поскольку я сам не уверен.
Намного раньше я также пытался сделать d самим объектом (std::function<bool(type)> d = [](type element) constexpr -> bool {return element};
), но мне тоже не повезло.`