這是對my previous question的後續問題。嵌套綁定表達式
#include <functional>
int foo(void) {return 2;}
class bar {
public:
int operator() (void) {return 3;};
int something(int a) {return a;};
};
template <class C> auto func(C&& c) -> decltype(c()) { return c(); }
template <class C> int doit(C&& c) { return c();}
template <class C> void func_wrapper(C&& c) { func(std::bind(doit<C>, std::forward<C>(c))); }
int main(int argc, char* argv[])
{
// call with a function pointer
func(foo);
func_wrapper(foo); // error
// call with a member function
bar b;
func(b);
func_wrapper(b);
// call with a bind expression
func(std::bind(&bar::something, b, 42));
func_wrapper(std::bind(&bar::something, b, 42)); // error
// call with a lambda expression
func([](void)->int {return 42;});
func_wrapper([](void)->int {return 42;});
return 0;
}
我越來越深的C++頭文件編譯錯誤:
functional:1137: error: invalid initialization of reference of type ‘int (&)()’ from expression of type ‘int (*)()’
functional:1137: error: conversion from ‘int’ to non-scalar type ‘std::_Bind<std::_Mem_fn<int (bar::*)(int)>(bar, int)>’ requested
func_wrapper(富)應該執行FUNC(DOIT(富) )。在真正的代碼中,它封裝了要執行的線程的函數。函數會由另一個線程執行的函數,doit坐在中間檢查未處理的異常並清理。但在func_wrapper附加綁定食堂的事情了......
也許刪除C++標記?這是直的C++ 0x – Anycorn 2010-04-29 20:33:33
保留這兩個標籤。 C++ 0x也是C++。 – jalf 2010-04-29 22:44:22
給PC-Lint一個旋風(來自www.gimpel.com)。它比Visual Studio提供更好更詳細的錯誤消息非常好。但是,它非常昂貴。 – 2010-05-14 10:55:52