【问题标题】:passing std::function* to template parameter将 std::function* 传递给模板参数
【发布时间】:2018-06-23 22:59:38
【问题描述】:

由于模板参数只能具有指​​向对象的指针,并且不允许使用 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);
    }
};

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

明确地说,我试过了:

*lambda = d&lt;type&gt;*lambda = &amp;d&lt;type&gt;&amp;lambda = &amp;d&lt;type&gt;&amp;lambda = *d&lt;type&gt;。可能其他人在我的争夺中,但我清楚地记得这些。

对于错误,我收到了:

* Concepts::Operators::d&lt;bool&gt;’ is not a valid template argument for type ‘std::function&lt;bool(bool)&gt;&amp;’ because it is not an object with linkage,

还有很多关于指针和引用之间的错误转换。

我希望有人能解释为什么尝试匹配指向引用的指针似乎不起作用,因为我自己也不确定。

更早的时候,我也尝试将 d 作为对象本身 (std::function&lt;bool(type)&gt; d = [](type element) constexpr -&gt; bool {return element};),但我也没有任何运气。 `

【问题讨论】:

  • 使用您的术语:当您尝试将d 设为对象本身并将&amp;lambda = d&lt;type&gt; 设为对象时,错误消息是什么?
  • 那...奏效了。好吧,去掉 d 类型的 * 就可以了。我猜如果 d 保存了堆积的匿名 lambda 的位置,然后我用 &lambda 引用它,那么它可以工作吗?
  • 可能是过度思考的情况。如果没有 *,d 是某个类的实例。使用 &,lambda 是对同一类的引用。要初始化一个类引用,你给它一个要引用的类实例。

标签: c++ templates pointers lambda reference


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-07
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多