2016-05-13 55 views
2
struct myclass 
{ 
    myclass(void(*)()) {} 
}; 

void test1(void(*)()) {} 
void test2(myclass) { } 
void cb() {} 

int main() 
{ 
    test1(cb);  // works 
    test2(cb);  // works 
    test1([](){}); // works 

    test2([](){}); // does not work, why? there's no "explicit" keyword next to myclass. 

} 

为什么这不起作用?将lamba隐式转换为函数ptr以创建类

以下显然可行,但我不想使用它。

 test2(myclass([]{})); 

注:我不想接受std::function<void()>>,我不想既可以创建template<T> myclass(T f) {}

回答

3

你只能有一个用户定义的转换 - 和lambda为一个函数指针数由用户自定义。相反,用一些sorcery明确做函数指针转换:

test2(+[](){}); 

还要注意的是,在一个无元lambda的括号是可选的,所以这也适用:

test2(+[]{}); 
+0

是的,我已经知道有关parens。不知道为什么我让他们在那里。我不知道这个+技巧寿。非常感谢你! OMG! – James

+0

OMG!那太糟了。我可以想象使用它,但事先会解释发生了什么,将会有10行注释! –

+1

@Martin你为什么需要10行评论?你看到它一次,查看它,你知道它的意思。 – Barry

2

您只能有一个转换序列中的用户定义转换。尝试:

test2(static_cast<void(*)()>([](){})); 

或者:

test2(static_cast<myclass>([](){})); 
+0

[演示](https://开头ideone.com/PerrSL) –

+0

Upvoted为用户定义的转换答案。简单地接受了巴里的那个,因为它更完整一点(它里面有+“魔法”),因为我完全不知道它是否生病。 – James