Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将std::function*传递给模板参数_C++_Templates_Pointers_Lambda_Reference - Fatal编程技术网

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

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)&

由于模板参数只能有指向对象的指针,并且不允许lambda文本,所以我一直在试图找到一种方法来捕获lambda并将其作为std::函数传入。由于参数不能是普通函数,我知道它必须是引用或指针。我尝试了函数&=*function\u ptr和函数*=&function\u ptr,但都出现了有关转换的错误。尝试&并导致
对象没有链接
错误。可以传入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
是对同一类的引用。要初始化类引用,请为其提供要引用的类实例。