передача std :: function * в параметр шаблона - PullRequest
0 голосов
/ 24 июня 2018

Поскольку параметры шаблона могут иметь только указатели на объекты и не допускают лямбда-литералы, я пытался найти способ перехватить лямбда-выражение и передать его как 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};), но мне тоже не повезло.`

1 Ответ

0 голосов
/ 24 июня 2018

Если вы хотите, чтобы ваш constexpr inline operator bool() действительно был constexpr, вы не можете использовать std::function, потому что у него нет конструктора constexpr.

Однако, поскольку вы используете constexpr lambdas (C ++ 17), вы также должны иметь возможность использовать auto тип в параметры шаблона . Может использоваться для передачи лямбды в ваш шаблон:

template<typename type>
auto d = [](type element) constexpr -> bool {
    return element;
};

template<typename type = bool, auto& 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);
    }
};

Демонстрационная версия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...