没有模板参数扣除参数包

时间:2016-06-16 09:54:36

标签: c++ templates c++11 variadic-templates

在下面的示例中,我想要将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}}?

0 个答案:

没有答案