在下面的示例中,我想要将Callback<FArgs...>::Handle
键入到另一个类中。实现与问题无关,因此代码非常小。
#include <memory>
template<typename... FArgs>
class Callback
{
public:
class Handle{};
};
class BaseCallbackHandle
{
};
using TypeErasedCallbackHandle = std::unique_ptr<BaseCallbackHandle>;
template<typename ...Args>
TypeErasedCallbackHandle makeTypeErasedCallbackHandle( typename Callback<Args...>::Handle handle)
{
return {};
}
int main()
{
Callback<int>::Handle h;
auto typeErasedHandle = makeTypeErasedCallbackHandle(h);
}
另请参阅:http://coliru.stacked-crooked.com/a/171cd34a46618c14
我认为makeTypeErasedCallbackHandle会自动推断出Args,但我得到以下编译错误:
clang++ -std=c++11 -O0 main.cpp && ./a.out
main.cpp:27:29: error: no matching function for call to 'makeTypeErasedCallbackHandle'
auto typeErasedHandle = makeTypeErasedCallbackHandle(h);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:19:26: note: candidate function [with Args = <>] not viable: no known conversion from 'Callback<int>::Handle' to 'typename Callback<>::Handle' for 1st argument
TypeErasedCallbackHandle makeTypeErasedCallbackHandle( typename Callback<Args...>::Handle handle)
^
1 error generated.
我做错了什么?
作为一种解决方法,我可以重新制定这样的功能:
template<typename H>
TypeErasedCallbackHandle makeTypeErasedCallbackHandle( H handle)
{
return {};
}
这有效但也允许用户将任何内容放入该函数中,而不仅仅是Callback<FArgs...>::handle
。
问题已被标记为重复。理解是理解的。让我再问一个问题,再次提出这个相关问题:有没有办法使用static_assert或enable_if帮助器确保在typename H
的第二个工作示例中只接受来自{{H
的{{1}} 1}}?