【发布时间】: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<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};),但我也没有任何运气。
`
【问题讨论】:
-
使用您的术语:当您尝试将
d设为对象本身并将&lambda = d<type>设为对象时,错误消息是什么? -
那...奏效了。好吧,去掉 d 类型的 * 就可以了。我猜如果 d 保存了堆积的匿名 lambda 的位置,然后我用 &lambda 引用它,那么它可以工作吗?
-
可能是过度思考的情况。如果没有 *,
d是某个类的实例。使用 &,lambda是对同一类的引用。要初始化一个类引用,你给它一个要引用的类实例。
标签: c++ templates pointers lambda reference