将std :: function *传递给模板参数

时间:2018-06-23 22:59:38

标签: c++ templates pointers lambda reference

由于模板参数只能具有指​​向对象的指针,并且不允许使用lambda文字,因此,我一直试图找到一种捕获lambda并将其作为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);
    }
};

目标是在编译时通过模板参数有效地传递算法。我曾考虑过使用constexpr和nullptr默认值来为lambda提供我实际上要具有的默认值,但我不明白为什么这样做是必要的。

为明确起见,我已经尝试过:

*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 :(得分:1)

如果您希望constexpr inline operator bool()实际上是constexpr,则不能使用std::function,因为它没有constexpr构造函数。

但是,由于您正在使用constexpr lambdas(C ++ 17),因此您还应该能够在template parameters中使用auto类型。它可以用来将lambda传递给您的模板:

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);
    }
};

Live demo