Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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++ 成员函数模板推导指南或其他方法,让编译器知道如何调用函数 struct setup\u条目 { 模板 无效禁用(bool(*p)(T*){…} }_C++_C++11_Templates_Lambda_C++17 - Fatal编程技术网

C++ 成员函数模板推导指南或其他方法,让编译器知道如何调用函数 struct setup\u条目 { 模板 无效禁用(bool(*p)(T*){…} }

C++ 成员函数模板推导指南或其他方法,让编译器知道如何调用函数 struct setup\u条目 { 模板 无效禁用(bool(*p)(T*){…} },c++,c++11,templates,lambda,c++17,C++,C++11,Templates,Lambda,C++17,调用禁用: struct setup_entry { template< typename T > void Disable( bool(*p)(T*) ) { ... } } setup\u条目X; 案例1:X.Disable([](int*)->bool{…})//推不出T 案例2:X.Disable([](int*)->bool{…})//可以推导出T 我想使用案例1。(方便用户使用) 有什么想法吗 记录的简化最终解决方案是: setup_entry X

调用禁用:

struct setup_entry 
{
    template< typename T >
    void Disable( bool(*p)(T*) ) { ... }
}
setup\u条目X;
案例1:X.Disable([](int*)->bool{…})//推不出T
案例2:X.Disable([](int*)->bool{…})//可以推导出T
我想使用案例1。(方便用户使用)

有什么想法吗


记录的简化最终解决方案是:

setup_entry X;

Case 1: X.Disable( [](int*)->bool{...} );        //FAIL to deduce T
Case 2: X.Disable<int>( [](int*)->bool{...} );   //OK   to deduce T
模板
无效禁用(T&回调)
{ 
自动p=+回调;
...
}

您不能这样做,因为在中不会考虑隐式转换(从lambda到函数指针)
T
无法推断

类型推导不考虑隐式转换(除了上面列出的类型调整):这是超载分辨率的工作,稍后会发生。

如果您想坚持自动类型推断,可以显式地将lambda转换为函数指针,例如

template< typename T >
void Disable( T&& Callback )
{ 
   auto p = +Callback;
   ...
}

X.Disable(static_cast([](int*)->bool{…});

首先,您应该知道
[](int*)->bool{…}
的类型是而不是
bool(int*)
bool(*)(int*)
;它是一种独特的闭包类型,可转换为
bool(*)(int*)

在这种情况下,这种类型是不可推断的

解决方案:显式地进行转换

X.Disable(static_cast<bool(*)(int*)>([](int*)->bool{...}));
或:

void Disable(std::function f){…}

与您的问题无关,但我建议不要使用函数指针作为参数。使用模板(就像所有标准库一样)或使用
std::function
。这样,您就可以使用任何可调用对象(例如带有捕获的lambdas)。顺便说一句,除非你在函数中需要
T
,否则为函数对象本身使用模板也可以解决你的问题。哈,第一个版本非常简洁!你介意详细介绍一下一元数
+
?@songyuanyao一元数
+
的有趣用法@lubgr&L.F.见。
X.Disable(static_cast<bool(*)(int*)>([](int*)->bool{...}));
X.Disable( static_cast<bool(*)(int*)>([](int*) -> bool {...}) );
template <typename F>
void Disable(F f)
{
    static_assert(std::is_invocable_r_v<bool, F, int*>, "your message here"); // if you want to ensure that the function is actually valid
    // ...
}
void Disable(std::function<bool(int*)> f) { ... }