C++ 将std::function*传递给模板参数
由于模板参数只能有指向对象的指针,并且不允许lambda文本,所以我一直在试图找到一种方法来捕获lambda并将其作为std::函数传入。由于参数不能是普通函数,我知道它必须是引用或指针。我尝试了函数&=*function\u ptr和函数*=&function\u ptr,但都出现了有关转换的错误。尝试&并导致C++ 将std::function*传递给模板参数,c++,templates,pointers,lambda,reference,C++,Templates,Pointers,Lambda,Reference,由于模板参数只能有指向对象的指针,并且不允许lambda文本,所以我一直在试图找到一种方法来捕获lambda并将其作为std::函数传入。由于参数不能是普通函数,我知道它必须是引用或指针。我尝试了函数&=*function\u ptr和函数*=&function\u ptr,但都出现了有关转换的错误。尝试&并导致对象没有链接错误。可以传入std::函数指针吗 这是我目前拥有的代码 template<typename type> std::function<bool(type)&
对象没有链接
错误。可以传入std::函数指针吗
这是我目前拥有的代码
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);
}
};
模板
std::function*d=newstd::function([](类型元素)constexpr->bool{return element;});
模板
结构布尔{
常数型元素;
constexpr内联显式布尔(类型element_-in):element(element_-in){}
constexpr内联运算符bool(){
返回*λ(元素);
}
};
目标是在编译时通过模板参数有效地传递算法。我曾经考虑过使用if constexpr和nullptr default来为lambda提供我实际上想要的默认值,但我不明白为什么这是必要的
明确地说,我试过:
*lambda=d
,*lambda=&d
,&lambda=&d
,以及&lambda=*d
。可能是其他人在我的混乱中,但我清楚地记得这些
对于错误,我收到:
*Concepts::Operators::d'不是类型“std::function&”的有效模板参数,因为它不是具有链接的对象
还有很多关于指针和引用之间不正确的转换
我希望有人能解释为什么试图匹配指向引用的指针似乎不起作用,因为我自己也不确定
早些时候,我还尝试将d作为对象本身(std::function d=[](type-element)constexpr->bool{return-element};
),但我也没有成功。
`如果希望constexpr内联运算符bool()
实际上是constexpr
,则不能使用std::function
,因为它没有constexpr构造函数
但是,由于您使用的是constexpr lambdas(C++17),因此还应该能够使用auto
type-in。它可用于将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);
}
};
模板
自动d=[](类型元素)constexpr->bool{
返回元素;
};
模板
结构布尔{
常数型元素;
constexpr内联显式布尔(类型element_-in):element(element_-in){}
constexpr内联运算符bool(){
返回lambda(元素);
}
};
使用您的术语:当您尝试将d
作为对象本身和&lambda=d
时,错误消息是什么?这……起了作用。好吧,摆脱了d的类型,这就成功了。我猜如果d持有堆积的匿名lambda的位置,然后我用&lambda引用它,那么它就起作用了?可能是一个考虑过度的情况。如果没有*,d
是某个类的实例。使用&,lambda
是对同一类的引用。要初始化类引用,请为其提供要引用的类实例。