由于模板参数只能具有指向对象的指针,并且不允许使用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};
),但是我也没有运气。
`
答案 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);
}
};