我試圖擴展std::packaged_task
來處理SEH異常,但我不能讓它編譯。C++ 11如何擴展一個類模板,如std :: packaged_task
以下不會編譯:
#include <stdio.h>
#include <functional>
#include <future>
#include <windows.h>
template<class RET, class... ARGS>
class SafePackagedTask : public std::packaged_task<RET(ARGS...)>
{
public:
template<class F>
explicit SafePackagedTask(F && f)
: std::packaged_task*(std::forward<F>(f))
{
}
void operator()(ARGS... args)
{
__try
{
std::packaged_task*(std::forward<ARGS>(args));
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("SEH Exception 0x%08lX in SafePackagedTask!\n", GetExceptionCode());
}
}
};
int main()
{
SafePackagedTask<int()> task([] {
//int *a = nullptr; *a = 1; // generate SEH
return 1;
});
std::future<int> fut = task.get_future();
task();
int rc = fut.get();
printf("result: %d\n", rc);
}
的錯誤是:
source_file.cpp(9): error C2091: function returns function
source_file.cpp(37): note: see reference to class template instantiation 'SafePackagedTask<int (void)>' being compiled
source_file.cpp(38): error C2440: 'initializing': cannot convert from 'std::future<_Ret>' to 'std::future<int>'
with
[
_Ret=int (__cdecl *)(void)
]
source_file.cpp(38): note: No constructor could take the source type, or constructor overload resolution was ambiguous
看到它的rextester.com。
我完全控制我的類的生命週期。非虛擬析構函數不是問題。 – rustyx
@rustyx我有同事誰擴展了其他性病庫類像矢量或地圖,也可行,雖然有點非正統。 –